2009-03-19 1 views
53

GNU C++에서 SSE, SSE2 및 SSE3의 속도를 높일 수있는 간단한 자습서가 있습니까? SSE에서 코드 최적화를 어떻게 수행 할 수 있습니까?GNE C++ 용 SSE SSE2 및 SSE3

+4

http://www.songho.ca/misc/sse/sse.html 내가 쉽게 SSE2 최적화를 만들 수있는 라이브러리를 썼다 - https://github.com/LiraNuna/glsl -sse2 – LiraNuna

+0

SSE에 고품질 링크가 많이있는이 [블로그 게시물] (http://minchechiu.blogspot.com/2009/05/sse.html)을 발견했습니다. – Philip

+0

여기 흥미로운 문서가 있습니다. http://ds9a.nl/gcc-simd/index.html –

답변

57

자습서를 모른다.

가장 좋은 내기 (IMHO)는 인텔이 제공하는 "내장"함수를 통해 SSE를 사용하여 단일 SSE 명령어를 랩핑하는 것입니다. 이러한 파일은 * mmintrin.h라는 포함 파일 집합을 통해 사용할 수 있습니다. 예를 들어 xmmintrin.h는 원래 SSE 명령 집합입니다.

Intel의 최적화 내용을 잘 알고있는 사람은 Reference Manual을 권장합니다 (내장 함수의 예는 4.3.1.2 절 참조). SIMD 섹션은 필수 읽기입니다. 명령어 세트 참조 매뉴얼은 각 명령어의 문서에 해당하는 "내장"함수가 포함되어 있으므로 매우 유용합니다.

내장 함수에서 컴파일러에 의해 생성 된 어셈블러를 검사 시간을 보낼 수행 (당신은 많은 것을 배울 수 있습니다) 및 프로파일/성능 측정에 (당신은 시간의 노력에 작은 수익에 대한 코드를 SSE는 - 보내고 낭비하지 않도록합니다).

업데이트 2011-05-31 :는에 내장 함수와 벡터화의 아주 좋은 범위가 Agner 안개의 그것에 대해 약간의 스프레드는 비록 optimization PDFs (thanks) (예 first onesecond one의 섹션 5 (12)) . 이들은 실제로 튜토리얼 자료가 아닙니다 (실제로 "이 매뉴얼은 초보자를위한 것은 아닙니다"라는 경고가 있음). 그러나 큰 최적화 도구 상자의 한 부분으로 SIMD (asm, 내장 함수 또는 컴파일러 벡터화를 통해 사용되는지 여부)를 올바르게 처리합니다.

업데이트 2012-10-04 :nice little Linux Journal article (gcc 벡터 내장 함수) 여기에서 언급 할 가치가 있습니다. 보다 단순한 SSE (PPC와 ARM 확장도 포함). last page에는 좋은 참고 자료가 있으며, 이는 Intel의 "intrinsics manual"에주의를 끌었습니다.

8

물론 -mtune 및 -march 옵션, -msse * 및 -mfpmath를 확인하십시오. 이들 모두는 GCC가 SSE 특정 최적화를 수행 할 수있게합니다.

그 이상의 모든 것은 어셈블러의 영역입니다. 나는 두려워합니다.

GCC Online Manual - i386 and x86_64 Options

+5

어셈블러가 필요하지 않습니다. GCC에는 MMX/SSE를 사용하기위한 특수 데이터 유형 및 "함수 호출"을 지원하는 확장 기능이 있습니다. –

+1

틀림없이 이것들은 어셈블리 용으로 얇게 포장 된 래퍼입니다. 따라서 asm에서 SSE를 프로그래밍 할 수 없으면 확장이 도움이되지 않습니다. –

+7

사실, 내장 함수는 어셈블리 주위의 래퍼 이상입니다. 컴파일러는 최대 성능을 위해 코드를 재정렬 할 수 있습니다. 하지만 SIMD가 어떻게 작동하는지 잘 이해해야합니다. –

1

간단한 튜토리얼? 내가 아는 한에서는 아니다.

그러나 MMX 또는 SSE의 모든 버전 사용에 대한 정보는 GCC 나 ICC 또는 VC와 상관없이 학습에 유용합니다.

GCC의 벡터 확장에 대해 배우려면 "info gcc"를 입력하고 노드 : 벡터 확장으로 이동하십시오.

19

가장 간단한 최적화는 gcc가 SSE 코드를 방출하도록 허용하는 것입니다.

플래그 : -msse, -msse2, -msse3, -march = -mfpmath =

보다 간결 목록

약 386 옵션 SSE, http://gcc.gnu.org/onlinedocs/gcc-4.3.3/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options를 참조하십시오 특정 컴파일러 버전에 대한 더 정확한 문서가있다 : http://gcc.gnu.org/onlinedocs/.

최적화를 위해 항상 Agner Fog 's : http://agner.org/optimize/을 확인하십시오.나는 그가 intrinsics에 대한 SSE 튜토리얼을 가지고 있지 않다고 생각하지만, 그는 정말 깔끔한 std-C++ 트릭을 가지고 있으며 SSE 어셈블리 코딩에 관한 많은 정보를 제공한다.

+0

'-mftree-vectorize'도 SSE를 출력합니다. – LiraNuna

+2

반드시 그렇지는 않습니다. "트리에서 루프 벡터화 수행 -이 플래그는 기본적으로 -O3에서 사용 가능합니다." 플래그 자체는 특정 플랫폼을 언급하지 않습니다 (표준 32 비트 레지스터에서 mutltiple 바이트를 처리 할 수도 있음). –

3

MSDN에는 SSE 컴파일러 내장 함수에 대한 설명이 포함되어 있습니다 (실제로 이러한 내장 함수는 사실상 표준이며 clang/XCode에서도 작동합니다).

그 기준의 좋은 점이므로, 예를 들어, 그것은 상응하는 의사를 표시한다는 것이다

r0 := a0 + b0 
r1 := a1 + b1 

그리고 여기에 비밀 셔플 명령의 좋은 설명입니다 : 당신이 ADDPD 명령임을 알 수

관련 문제