문제

GCC가 할 수있는 자동 벡터화를 활용 한 사람이 있습니까? 실제 세계에서 (예제 코드와 반대로)? 활용하려면 기존 코드의 구조 조정이 필요합니까? 이런 식으로 벡터화 할 수있는 생산 코드에 상당수의 사례가 있습니까?

도움이 되었습니까?

해결책

나는 아직 GCC 또는 Intel C ++가 알고리즘 코드가 주어지면 (그리고 SSE Intrinsics를 사용하여 수동으로 다시 작성한 후) 벡터화 될 때에도 매우 간단한 루프를 자동으로 벡터화하는 것을 아직 보지 못했습니다.

이 중 일부는 보수적입니다. 특히 포인터 별명에 직면 할 때 C/C ++ 컴파일러가 프로그래머가 알고 있더라도 벡터화가 안전하다는 것을 '증명'하기가 매우 어려울 수 있습니다. 대부분의 컴파일러는 코드를 잘못 사용하는 대신 코드를 최적화하지 않는 것을 선호합니다. 이것은 고급 언어가 적어도 이론적으로 C보다 실질적인 이점을 가진 영역 중 하나입니다 (이론적으로는 자동으로 ML 또는 Haskell 컴파일러를 자동으로 벡터화하는 것을 알지 못하기 때문에 이론적으로 말합니다).

그것의 또 다른 부분은 단순히 분석적 한계입니다. 벡터화에 대한 대부분의 연구는 몇 년 전 (Cuda 사이에있을 때) 대부분의 벡터 기계의 빵과 버터 인 고전적인 수치 문제 (유체 역학, 예를 들어)와 관련이 있습니다. /opencl, altivec/sse 및 sti 셀, 다양한 형태의 벡터 프로그래밍이 상용 시스템에서 널리 사용되었습니다).

스칼라 프로세서를 위해 작성된 코드가 컴파일러가 벡터화하기가 쉽습니다. 행복하게도, 컴파일러가 루프 타일링 및 부분 루프 Unrolling과 같이 컴파일러가 벡터를 벡터화하는 방법을 쉽게 이해할 수 있도록 할 수있는 많은 것들이 컴파일러가 방법을 알아 내지 않더라도 현대 프로세서의 성능을 도울 수 있습니다. 벡터화하십시오.

다른 팁

모든 비즈니스 로직에서 사용하기는 어렵지만 같은 방식으로 볼륨의 데이터를 처리 할 때 속도 업을 제공합니다.

좋은 예는 모든 샘플/픽셀에 동일한 작업을 적용하는 사운드/비디오 처리입니다. 나는 이것을 위해 VisualDSP를 사용했으며, 컴파일 후 결과를 확인해야했습니다 - 그것이 실제로 필요한 경우 실제로 사용되는 경우.

벡터화는 주로 수치 프로그램에 유용합니다. 벡터화 된 프로그램은 PS3 게임 콘솔에 사용되는 STI 셀 프로세서와 같은 벡터 프로세서에서 더 빨리 실행될 수 있습니다. 예를 들어, 게임 그래픽 렌더링에 사용 된 수치 계산은 벡터화에 의해 많은 속도를 높일 수 있습니다. 이러한 프로세서를 SIMD (단일 명령 다중 데이터) 프로세서라고합니다.

다른 프로세서에서는 벡터화가 사용되지 않습니다. 벡터화 된 프로그램은 비 SIMD 프로세서에 적용 할 수없는 벡터 지침 세트에서 실행됩니다.

Intel의 Nehalem 시리즈 프로세서 (2008 년 후반 출시)는 SIMD 지침 인 SSE 4.2 지침을 구현합니다. 원천: 위키 백과.

벡터화 된 지침은 셀 프로세서에만 국한되지 않습니다. 대부분의 최신 워크 스테이션과 유사한 CPU는이를 가지고 있습니다 (PPC, Pentium 3, SPARC 등). 플로팅 포인트 작업에 잘 사용되면 매우 컴퓨팅 집중 작업 (필터 등)에 많은 도움이 될 수 있습니다. 내 경험상 자동 벡터화는 잘 작동하지 않습니다.

당신은 거의 아무도 실제로 GCC의 자동 벡터화를 잘 활용하는 방법을 아는 사람이 없다는 것을 알았을 것입니다. 사람들의 의견을 보려면 웹을 검색하면 GCC가 자동 벡터화를 가능하게 할 수 있지만 실제로는 거의 사용하지 않으므로 Simd Acceleration (예 : MMX, MMX, SSE, AVX, NEON, ALTIVEC), 귀하는 기본적으로 컴파일러 내재 또는 어셈블리 언어 코드를 사용하여 작성하는 방법을 알아냅니다.

그러나 Intrinsics의 문제점은 어셈블리 언어 측면을 효과적으로 이해하고 원하는 것을 설명하는 Intrinsics 방법을 배워야한다는 것입니다. 이는 어셈블리 코드로 작성하는 것보다 훨씬 덜 효율적인 코드를 초래할 수 있습니다 (). 컴파일러가 여전히 고유 지침을 잘 활용하는 데 어려움을 겪을 것이기 때문에 10x의 계수와 같은 것과 같은!

예를 들어, 많은 작업이 동시에 병렬로 수행 될 수 있도록 SIMD INTRINSICS를 사용할 수 있지만 컴파일러는 SIMD 레지스터와 일반 CPU 레지스터 사이에 데이터를 전송하는 어셈블리 코드를 생성하여 효과적으로 만듭니다. SIMD 코드는 일반 코드와 비슷한 속도 (또는 더 느린)로 실행됩니다!

그래서 기본적으로:

  • 최대 100% 속도 업 (2 배 속도)을 원한다면 공식 Intel/Arm 컴파일러를 구매하거나 일부 코드를 변환하여 Simd C/C ++ Intrinsics를 사용하십시오.
  • 1000% 속도를 원한다면 (10 배 속도) SIMD 지침을 사용하여 어셈블리 코드로 작성하십시오. 또는 하드웨어에서 사용할 수있는 경우 OpenCL 또는 NVIDIA의 CUDA SDK와 같은 GPU 가속도를 사용하십시오. SIMD가 CPU에서와 마찬가지로 GPU에서 유사한 속도를 제공 할 수 있기 때문입니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top