SSE (2/3) 레지스터에 컴파일 타임 상수 float을로드하는 효율적인 방법을 알아 내려고하고있다. 이런 간단한 코드를 시도해 보았습니다.로드 상수가 SSE 레지스터에 뜬다
const __m128 x = { 1.0f, 2.0f, 3.0f, 4.0f };
그러나 메모리에서 4 개의 movss 명령을 생성합니다! 메모리 부족 (?!?!)
비록 이렇게 상기 스칼라로드
movss xmm0,dword ptr [[email protected] (14048E534h)]
movss xmm1,dword ptr [[email protected] (14048E530h)]
movaps xmm6,xmm12
shufps xmm6,xmm12,0C6h
movss dword ptr [rsp],xmm0
movss xmm0,dword ptr [[email protected] (14048E52Ch)]
movss dword ptr [rsp+4],xmm1
movss xmm1,dword ptr [[email protected] (14048E528h)]
..
float Align(16) myfloat4[4] = { 1.0f, 2.0f, 3.0f, 4.0f, }; // out in global scope
가 발생한다. 나는 터치 메모리를 고르게하지 않는 방법이 될 그냥 바로 스타일의 지시와 함께 할 것입니다 자신의 상수가있는 경우
movaps xmm5,xmmword ptr [::myarray4 (140512050h)]
이상적으로는 좋은 것 (예를 들어, 명령어 자체로 컴파일 상수).
감사
이와 같은
고성능 SSE/2 코드의 경우 GCC/ICC를 사용하는 것이 좋습니다. 이유에 대한 자세한 내용은 다음을 참조하십시오. - http://www.liranuna.com/sse-intrinsics-optimizations-in-popular-compilers/ – LiraNuna