나는 SSE2 코드를 해당 코드하는 MMX를 변환. 그리고 거의 1.5x-2x의 속도 향상을 기대했습니다. 그러나 둘 다 똑같은 시간을 보냈습니다. 왜 그럴까요?
시나리오 :
것은 내가 SIMD 명령어 세트 및 성능 비교를 배우고 있어요. 나는 배열 작업을 다음과 같이 수행했습니다 : Z = X^2 + Y^2
여기서 X와 Y는 "char"의 큰 1 차원 배열입니다. X와 Y의 값은 이 1보다 작으므로 Z는 항상 <255 (1 바이트)이됩니다. (오버플로 걱정하지 않아도됩니다.)
먼저 C++ 코드를 작성하고 시간을 확인했습니다. 그런 다음 해당 조립 코드 (~ 3x 속도 향상)를 썼습니다. 그런 다음 MMX 코드 (~ 12x v/s C++)를 작성했습니다. 그런 다음 MMX를 SSE2 코드로 변환했으며 MMX 코드와 동일한 속도를 사용합니다. 이론적으로 SSE2에서 나는 MMX에 비해 ~ 2 배의 속도 향상을 기대했다.
MMX에서 SSE2로 변환 할 때 모든 mmx reg를 xmm reg로 변환했습니다. 그런 다음 몇 가지 이동 명령 등을 변경했습니다.
내 MMX와 SSE 코드는 여기에 붙여 넣습니다 : https://gist.github.com/abidrahmank/5281486 이 기능은 나중에 배열을 인수로 전달되는 MAIN.CPP 파일에서 호출
(내가 여기에 모두 붙여 넣을하지 않음).
은 내가 무슨 짓을 :
1 - 나는 인텔과 다른 웹 사이트에서 일부 최적화 매뉴얼을 통해 갔다. SSE2 코드의 주된 문제점은 16_ 메모리 정렬입니다. 주소를 수동으로 확인하면 모두 16_ 메모리 정렬 된 것으로 확인됩니다. 그러나 나는 MOVDQU과 MOVDQA을 모두 사용했으나 두 결과 모두 MMX와 비교하여 동일한 결과를 얻었지만 속도는 향상되지 않았습니다.
2 - 디버그 모드로 갔다가 명령 실행으로 각 레지스터 값을 확인했습니다. 그리고 그들은 내가 생각한 것과 똑같이 실행되고 있습니다. 즉, 16 바이트가 취해지고 그 결과로 16 바이트가 출력됩니다.
자료 :
나는 윈도우 7 및 Visual C와 인텔 코어 i5 프로세서를 사용하고 ++ 2010
질문 : 어떤 성능 향상이없는 이유
그래서 마지막 질문은, SSE2 코드가 MMX 코드에 비해? SSE 코드에서 잘못된 것이 있습니까? 아니면 다른 설명이 있습니까?
SSE 코드에'emms'가 있지만 그 원인이되어서는 안됩니다. 배열은 얼마나 걸립니까? – harold
@harold : 배열은 크고 크기는 100000000 바이트입니다. 나는 그 시간을보기 위해 크게 만들었다. 그렇지 않으면 0 시간에 발생합니다. –
그래도 문제가있어. 캐시보다 훨씬 크기 때문에 병목 현상이 메인 메모리 처리량입니다. – harold