잘못 정렬 최적화하기 위해 노력하고 있지만 내 유한 차이 코드에 필요한 읽기, I는 다음과 같이 정렬되지 않은 부하를 변경 :이에일부 CPU에서는 SSE가 정렬되지 않은 읽기보다 느리게 정렬되고 셔플이되는 이유는 무엇입니까?
__m128 pm1 =_mm_loadu_ps(&H[k-1]);
가 + 셔플 읽어 정렬 코드 : H
는 16 바이트입니다
__m128 p0 =_mm_load_ps(&H[k]);
__m128 pm4 =_mm_load_ps(&H[k-4]);
__m128 pm1 =_mm_shuffle_ps(p0,p0,0x90); // move 3 floats to higher positions
__m128 tpm1 =_mm_shuffle_ps(pm4,pm4,0x03); // get missing lowest float
pm1 =_mm_move_ss(pm1,tpm1); // pack lowest float with 3 others
, - 정렬; H[k+1]
, H[k±3]
및 movlhps
& movhlps
H[k±2]
(here의 전체 루프 코드)에 대한 유사한 변경이있었습니다.
내 코어 i7-930에서 H[k±3]
읽기가 최적화 된 것으로 나타 났으며 ±1
에 다음 최적화를 추가하면 백분율 단위로 속도가 느려집니다. ±1
과 ±3
사이에서 전환해도 결과는 바뀌지 않았습니다.
동시에 코어 2 - 6300 듀오 및 코어 2 쿼드에서 두 가지 최적화 (±1
및 ±3
)를 사용하면 성능이 향상되고 (수십 %) 코어 i7-4765T의 경우 성능이 저하됩니다 퍼센트 단위).
펜티엄 4에서 movlhps
/movhlps
을 포함하여 불일치 읽기를 최적화하려고하면 모든 속도가 느려집니다.
왜 CPU마다 다른가? 코드 크기가 커지기 때문에 루프가 일부 명령어 캐시에 맞지 않을 수 있습니까? 또는 일부 CPU는 잘못 정렬 된 읽기에 민감하지 않고 다른 일부는 훨씬 더 민감하기 때문에 그럴 수 있습니까? 또는 셔플 같은 동작이 일부 CPU에서 느릴 수 있습니까?
'movhlps','shufps','movaps reg, reg'까지 모두 P4에서 느립니다. 끔찍하다. 나는 P4가 존재하지 않았으며 Core2 이상에 초점을 맞추었다. – harold