2013-03-31 5 views
2

문제 :MMX의 V/s의 SSE2 실적 비교

나는 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_ 메모리 정렬 된 것으로 확인됩니다. 그러나 나는 MOVDQUMOVDQA을 모두 사용했으나 두 결과 모두 MMX와 ​​비교하여 동일한 결과를 얻었지만 속도는 향상되지 않았습니다.

2 - 디버그 모드로 갔다가 명령 실행으로 각 레지스터 값을 확인했습니다. 그리고 그들은 내가 생각한 것과 똑같이 실행되고 있습니다. 즉, 16 바이트가 취해지고 그 결과로 16 바이트가 출력됩니다.

자료 :

나는 윈도우 7 및 Visual C와 인텔 코어 i5 프로세서를 사용하고 ++ 2010

질문 : 어떤 성능 향상이없는 이유

그래서 마지막 질문은, SSE2 코드가 MMX 코드에 비해? SSE 코드에서 잘못된 것이 있습니까? 아니면 다른 설명이 있습니까?

+0

SSE 코드에'emms'가 있지만 그 원인이되어서는 안됩니다. 배열은 얼마나 걸립니까? – harold

+0

@harold : 배열은 크고 크기는 100000000 바이트입니다. 나는 그 시간을보기 위해 크게 만들었다. 그렇지 않으면 0 시간에 발생합니다. –

+1

그래도 문제가있어. 캐시보다 훨씬 크기 때문에 병목 현상이 메인 메모리 처리량입니다. – harold

답변

3

Harold 님의 댓글은 정말 정확했습니다. 처리중인 h 열은 시스템의 3시에 맞지 않으 G로 계산은 전적으로로드 저장 Y 인드입니다.

나는 다양한 버퍼 길이에 대한 현재의 세대 I7에 대한 귀하의 계산의 처리량, 또한 제거 된로드 및 저장을 제외한 모든과 같은 일상의 처리량 시간 초과 :

throughput

무엇 버퍼가 커져서 L3 캐시를 벗어나면 계산의 처리량이 달성 된로드/저장 대역폭과 정확하게 일치한다는 것을 알 수 있습니다. 이것은 을 어떻게 알습니까? 데이터를 처리하는 것은 본질적으로 차이가 없습니다 (훨씬 느리게하지 않는 한). 계산 속도는 프로세서가 메모리로 /로부터 데이터를 이동시키는 능력에 의해 제한됩니다.

작은 배열에서 타이밍을 수행하면 두 구현간에 차이가 나타납니다.

+0

네, 맞습니다. 내가 1 메가 바이트 크기로 배열을 변경하고 지금은 차이가 있습니다. 하지만 다시 한 가지 문제가 있습니다. 이제 SSE2 코드가 MMX보다 '3-5x'빠릅니다. 가능할 수 있습니까? 나는 그것이 ~ 2x에 가까워 야한다고 생각했다. (나는 C++, MMX 및 SSE를 동일한 파일에서 하나씩 호출하고 있으므로 캐시 효과가 적용될 예정입니까?) –

+0

또 다른 질문입니다. 매우 높은 데이터에 대한 플롯에서 산술 연산이로드/저장과 동일 해집니다 조작. 왜 그런가요? –

+0

좋은 그래프, 어떤 도구를 사용하여 제작 했습니까? – Cameron