8 개의 부동 벡터 또는 4 개의 double을 수용하기 위해 AVX를 사용하는 SSE2 사인 및 코사인 함수 (CEPHES sinf 함수를 기반으로 한 Julien Pommier의 sse_mathfun.h에서)를 변환합니다.SSE 코드를 AVX로 변환 - 비용은 _mm256_and_ps입니다.
그래서 줄리앙의 함수 sin_ps는 sin_ps8 (8 개의 부동 소수점 형)이되고 sin_pd4는 4 배가됩니다. (여기에서 "고급"편집기는 내 코드를 수락하지 않으므로 http://arstechnica.com/civis/viewtopic.php?f=20&t=1227375을 방문하십시오.)
2011 Core2 i7 @ 2.7Ghz에서 실행되는 Mac OS X 10.6.8에서 clang 3.3으로 테스트하여 벤치마킹 결과보기 이 같은
SINF .. -> 벡터 평가 27.7 백만/초 07 5.56e + 위에 iters (표준 스칼라 SINF() 함수)
sin_ps .. 중 -> 41.0 백만 벡터 평가/초당 8.22e + 07 iters
01 23,516,sin_pd4 ... -> 벡터 평가/초 8.06e + 07 iters
sin_ps8 위에 40.2 백만 ... -> 벡터 평가 2.5 백만/06 초 + 5.1e 위에 iters
sin_ps8의 비용은 정말 놀랍습니다. _mm256_castsi256_ps 사용으로 인한 것 같습니다. 사실, "poly_mask = _mm256_castsi256_ps (emmm2);"줄을 주석으로 처리합니다. 보다 정상적인 성능을 제공합니다. sin_pd4는 _mm_castsi128_pd를 사용하지만 sin_ps8에서 SSE와 AVX 명령어를 섞어 쓰는 것이 아닙니다. _mm_castsi128_ps에 2 번의 호출로 _mm256_castsi256_ps 호출을 에뮬레이션하면 성능이 향상되지 않습니다. emm2와 emm0는 emmm2와 emmm0에 대한 포인터이며, v8si 인스턴스와 그러므로 (선험적으로) 32 비트 경계에 정확하게 정렬됩니다.
컴파일 가능한 코드는 sse_mathfun.h 및 sse_mathfun_test.c을 참조하십시오.
나는 벌칙을 피하기 위해 (쉬운) 방법이 있습니까?
누락 된 코드에 대해 정말 죄송합니다. 미리보기가 잘 보였지만 내 텍스트는 게시가 거부되었습니다 ... – RJVB
"Core2 i7"은 무엇입니까? – Mysticial
Agner Fog의 [최적화 테이블] (http://www.agner.org/optimize/#manuals)에서는 인수의 크기와 관계없이 'ANDPS' 및'VANDPS '의 Ivy Bridge 및 Haswell 대기 시간이 1 사이클임을 보여줍니다. 덧붙여서,'_mm256_castsi256_ps'는 실제로 지시를 내 보내지 않습니다. 이것은 진정한 타입 캐스트입니다. 순전히 컴파일러에 있습니다. 당신의 문제는 아마도 다른 곳에있을 것입니다. –