GNU C++에서 SSE, SSE2 및 SSE3의 속도를 높일 수있는 간단한 자습서가 있습니까? SSE에서 코드 최적화를 어떻게 수행 할 수 있습니까?GNE C++ 용 SSE SSE2 및 SSE3
답변
자습서를 모른다.
가장 좋은 내기 (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 one과 second one의 섹션 5 (12)) . 이들은 실제로 튜토리얼 자료가 아닙니다 (실제로 "이 매뉴얼은 초보자를위한 것은 아닙니다"라는 경고가 있음). 그러나 큰 최적화 도구 상자의 한 부분으로 SIMD (asm, 내장 함수 또는 컴파일러 벡터화를 통해 사용되는지 여부)를 올바르게 처리합니다.
업데이트 2012-10-04 :nice little Linux Journal article (gcc 벡터 내장 함수) 여기에서 언급 할 가치가 있습니다. 보다 단순한 SSE (PPC와 ARM 확장도 포함). last page에는 좋은 참고 자료가 있으며, 이는 Intel의 "intrinsics manual"에주의를 끌었습니다.
물론 -mtune 및 -march 옵션, -msse * 및 -mfpmath를 확인하십시오. 이들 모두는 GCC가 SSE 특정 최적화를 수행 할 수있게합니다.
그 이상의 모든 것은 어셈블러의 영역입니다. 나는 두려워합니다.
어셈블러가 필요하지 않습니다. GCC에는 MMX/SSE를 사용하기위한 특수 데이터 유형 및 "함수 호출"을 지원하는 확장 기능이 있습니다. –
틀림없이 이것들은 어셈블리 용으로 얇게 포장 된 래퍼입니다. 따라서 asm에서 SSE를 프로그래밍 할 수 없으면 확장이 도움이되지 않습니다. –
사실, 내장 함수는 어셈블리 주위의 래퍼 이상입니다. 컴파일러는 최대 성능을 위해 코드를 재정렬 할 수 있습니다. 하지만 SIMD가 어떻게 작동하는지 잘 이해해야합니다. –
간단한 튜토리얼? 내가 아는 한에서는 아니다.
그러나 MMX 또는 SSE의 모든 버전 사용에 대한 정보는 GCC 나 ICC 또는 VC와 상관없이 학습에 유용합니다.
GCC의 벡터 확장에 대해 배우려면 "info gcc"를 입력하고 노드 : 벡터 확장으로 이동하십시오.
가장 간단한 최적화는 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 어셈블리 코딩에 관한 많은 정보를 제공한다.
'-mftree-vectorize'도 SSE를 출력합니다. – LiraNuna
반드시 그렇지는 않습니다. "트리에서 루프 벡터화 수행 -이 플래그는 기본적으로 -O3에서 사용 가능합니다." 플래그 자체는 특정 플랫폼을 언급하지 않습니다 (표준 32 비트 레지스터에서 mutltiple 바이트를 처리 할 수도 있음). –
MSDN에는 SSE 컴파일러 내장 함수에 대한 설명이 포함되어 있습니다 (실제로 이러한 내장 함수는 사실상 표준이며 clang/XCode에서도 작동합니다).
- http://msdn.microsoft.com/en-us/library/26td21ds.aspx
- http://msdn.microsoft.com/en-us/library/kcwz153a.aspx
그 기준의 좋은 점이므로, 예를 들어, 그것은 상응하는 의사를 표시한다는 것이다
r0 := a0 + b0
r1 := a1 + b1
그리고 여기에 비밀 셔플 명령의 좋은 설명입니다 : 당신이 ADDPD 명령임을 알 수
- 1. Visual Studio 2008에서 SSE3/SSE4.1 명령어 세트를 활성화하려면 어떻게합니까?
- 2. C++에서 SSE/AVX를위한 x86 CPU 디스패치
- 3. SSE 및 하이퍼 스레딩
- 4. glibc 및 SSE 기능
- 5. Visual Studio 2008에서 CMake를 사용하여 SSE/SSE2 명령어 세트를 활성화하려면 어떻게해야합니까? 내가 갔던 비주얼 스튜디오 2005
- 6. Visual C++에서 SSE2 intrinsics 제거
- 7. /proc/cpuinfo에서 GCC 용 sse 스위치 빌드
- 8. Visual C++ (x64)의 SSE2 옵션
- 9. SSE2 값 추출 문제
- 10. 버퍼의 SSE 명령어
- 11. /CLR 스위치로 SSE2 명령 지원
- 12. Visual Studio 6 프로세서 팩 SSE2 사용
- 13. SSE : __m128 및 __m128i를 __m128d로 변환하십시오.
- 14. SSE2 : 더블 정밀 로그 기능
- 15. SSE 액세스 위반
- 16. 높은 수준의 SSE 플래그는 GCC/clang에서 낮은 SSE 플래그를 암시합니까?
- 17. C는 - GCC SSE 벡터 확장
- 18. SSE (1,2,3,4) 최적화는 어떻게 사용합니까?
- 19. SSE2 - "시스템에서 지정된 프로그램을 실행할 수 없습니다."
- 20. VC++ SSE 본질 최적화 이상한
- 21. 의 OpenMP와 SSE, 내 프로그램은
- 22. 로드 상수가 SSE 레지스터에 뜬다
- 23. SSE 정규화가 간단한 근사보다 느린가요?
- 24. AltiVec에 MMX/SSE 명령어 포팅하기
- 25. SSE 마이크로 최적화 명령 주문
- 26. sse 유형의 배열 : 분할 오류
- 27. CMake에서 sse 가용성을 감지하는 방법
- 28. C, C#, C++ 및 Java 용 C# 코드 분석기
- 29. UI 용 C# 라이브러리 용 C++
- 30. SSE 명령어로 복제 - XMM 레지스터 확장
http://www.songho.ca/misc/sse/sse.html 내가 쉽게 SSE2 최적화를 만들 수있는 라이브러리를 썼다 - https://github.com/LiraNuna/glsl -sse2 – LiraNuna
SSE에 고품질 링크가 많이있는이 [블로그 게시물] (http://minchechiu.blogspot.com/2009/05/sse.html)을 발견했습니다. – Philip
여기 흥미로운 문서가 있습니다. http://ds9a.nl/gcc-simd/index.html –