알고리즘의 병목 현상 인 수천 개의 루프라는 명령어 블록을 최적화하려고합니다.x86 어셈블리 명령어 최적화
이 코드 블록은 N 벡터 3 (iA 어레이)에 대한 N 행렬 3x3 (iA 어레이)의 곱셈을 계산하고 N 결과를 oV 어레이에 저장합니다.
행렬 및 벡터의 각 행은 SSE 최적화를 사용하기 위해 128 비트 정렬 (4 개 부동 소수점)되어 있습니다 (4 번째 부동 값은 무시 됨).
C++ 코드 :
__m128* ip = (__m128*)iV;
__m128* op = (__m128*)oV;
__m128* A = (__m128*)iA;
__m128 res1, res2, res3;
int i;
for (i=0; i<N; i++)
{
res1 = _mm_dp_ps(*A++, *ip, 0x71);
res2 = _mm_dp_ps(*A++, *ip, 0x72);
res3 = _mm_dp_ps(*A++, *ip++, 0x74);
*op++ = _mm_or_ps(res1, _mm_or_ps(res2, res3));
}
컴파일러는이 지침 생성 낮은 수준의 최적화와
000007FEE7DD4FE0 movaps xmm2,xmmword ptr [rsi] //move "ip" in register
000007FEE7DD4FE3 movaps xmm1,xmmword ptr [rdi+10h] //move second line of A in register
000007FEE7DD4FE7 movaps xmm0,xmmword ptr [rdi+20h] //move third line of A in register
000007FEE7DD4FEB inc r11d //i++
000007FEE7DD4FEE add rbp,10h //op++
000007FEE7DD4FF2 add rsi,10h //ip++
000007FEE7DD4FF6 dpps xmm0,xmm2,74h //dot product of 3rd line of A against ip
000007FEE7DD4FFC dpps xmm1,xmm2,72h //dot product of 2nd line of A against ip
000007FEE7DD5002 orps xmm0,xmm1 //"merge" of the result of the two dot products
000007FEE7DD5005 movaps xmm3,xmmword ptr [rdi] //move first line of A in register
000007FEE7DD5008 add rdi,30h //A+=3
000007FEE7DD500C dpps xmm3,xmm2,71h //dot product of 1st line of A against ip
000007FEE7DD5012 orps xmm0,xmm3 //"merge" of the result
000007FEE7DD5015 movaps xmmword ptr [rbp-10h],xmm0 //move result in memory (op)
000007FEE7DD5019 cmp r11d,dword ptr [rbx+28h] //compare i
000007FEE7DD501D jl MyFunction+370h (7FEE7DD4FE0h) //loop
난 아주 익숙하지를, 그래서 질문은 : 당신은 몇 가지 가능한 최적화를 볼 수 있나요 내가 직접 어셈블리 코드를 작성한다면? 예를 들어
, 내가 변경하는 경우가 더 빠르게 실행됩니다
add rbp,10h
movaps xmmword ptr [rbp-10h],xmm0
나는 또한 ... 그 ADD 명령이 INC보다 빠른 읽기
당신이 물어 보았던 특별한 마이크로 최적화 (아마도'add' /'movaps'와'add''와'inc'의 순서)는 당신이 코딩하고있는 특정 CPU 종류, 달의 위상, 나는 속도의 차이가 주 계산에 소비 된 시간과 겹칠 것이기 때문에 당신이 시도해도 측정 가능한 차이를 보지 못할 것이라고 상상한다. 현명하게도, 나는 그 코드에 많은 체지방을 보지 못한다. 아마도 SSE 전문가는 벡터화가 인텔의 벡터 지침에 얼마나 잘 맞는지에 대해 의견을 제시 할 수 있습니다. –
* "ADD 명령이 INC보다 빠르다는 것을 읽었습니다 ..."* - 정말요? 나는 조립에 대해선 몰라.하지만 이상하게 보인다. 그렇다면 인수 1을 사용하여 ADD를 사용할 수있을 때 왜 INC를 사용해야합니까? INC가 존재하는 이유는 무엇입니까? –
'add'와'inc'는 플래그와 관련이 있습니다. inc 뒤에 캐리 플래그를 읽는 것이 문제가 될 수 있습니다. P4에서는 다른 방식으로 작동합니다.'inc'는 플래그를 기다려야합니다. 이 경우 플래그를 즉시 덮어 쓰는 것이므로이 'inc'는 P4를 제외한 모든 것에 문제가되지 않습니다. (진지하게, 누가 P4를 신경 쓰는지) – harold