간단한 이진 뺄셈의 SSE로 인한 최대 이론적 속도는 얼마입니까?
-
13-09-2019 - |
문제
내 코드의 내부 루프가 하드웨어 디자인 장벽에 부딪 치거나 내 부분 장벽에 대한 이해 부족 여부를 알아 내려고 노력할 때. 조금 더 많지만 대답하기 위해 내가 생각해 낼 수있는 가장 간단한 질문은 다음과 같습니다.
다음 코드가있는 경우 :
float px[32768],py[32768],pz[32768];
float xref, yref, zref, deltax, deltay, deltaz;
initialize_with_random(px);
initialize_with_random(py);
initialize_with_random(pz);
for(i=0;i<32768-1;i++) {
xref=px[i];
yref=py[i];
zref=pz[i];
for(j=0;j<32768-1;j++ {
deltx=xref-px[j];
delty=yref-py[j];
deltz=zref-pz[j];
} }
코드 (어셈블리, 내입 등)를 완전히 제어 할 수있는 상황에서 SSE 지침으로 이동하여 아키텍처 이외의 런타임 환경을 제어 할 수없는 상황에서 SSE 지침으로 이동하여 어떤 유형의 이론적 속도를 볼 수 있을까요? 사용자 환경이므로 OS 커널이 내 특정 프로세스에 시간을 할당하는 방법에 대해 아무것도 할 수 없습니다).
지금은 내 코드로 3 배의 속도가 상승하는 것을보고 있습니다. 처리량). (컴파일러가 자동 프로모션에 충분히 똑똑하지 않지만 여전히 3 배의 속도 만 볼 수있는 경우 Deltx/Delty/Deltz를 배열로 만드는 것과 같은 것들을 시도했습니다.) Intel C 컴파일러를 사용하고 있습니다. 벡터화를위한 적절한 컴파일러 플래그이지만 분명히 본질은 없습니다.
해결책
CPU에 따라 다릅니다. 그러나 이론적 인 최대는 4 배 이상이되지 않습니다. 클록주기 당 하나 이상의 SSE 명령을 실행할 수있는 CPU를 모릅니다. 많으면 사이클 당 4 값을 계산합니다.
대부분의 CPU는 할 수 있습니다 적어도 사이클 당 플로팅 포인트 스칼라 명령이 있으므로이 경우 4 배 속도의 이론적 최대가 표시됩니다.
그러나 실행중인 CPU에 대한 특정 명령 처리량을 찾아야합니다.
그러나 3 배의 실질적인 속도는 꽤 좋습니다.
다른 팁
나는 당신이 아마도 내부 루프를 어떻게 든 인터 리브해야한다고 생각합니다. 3 성분 벡터는 한 번에 완료되지만 한 번에 3 개의 작업 일뿐입니다. 4에 도달하려면 첫 번째 벡터에서 3 개의 구성 요소를, 다음 1 개, 다음은 2 및 2 등을 수행합니다. 한 번에 데이터 4 구성 요소를로드하고 처리하는 일종의 대기열을 설정 한 다음 이후에 분리하면 작동 할 수 있습니다.
편집 : 내부 루프를 풀어 반복 당 4 개의 벡터를 수행 할 수 있습니다 (배열 크기가 항상 4의 배수라고 가정 함). 그것은 내가 위에서 말한 것을 성취 할 것입니다.
고려 : 플로트는 얼마나 넓습니까? ssex 명령은 얼마나 넓습니까? 비율은 당신에게 어떤 종류의 합리적인 상한을 제공해야합니다.
또한, 외곽 파이프가 좋은 속도를 추정하는 데있어 혼란스러워한다는 점도 주목할 가치가 있습니다.
당신은 고려해야합니다 루프 타일링 - 내부 루프에서 값에 액세스하는 방식은 아마도 L1 데이터 캐시에서 많은 스 래시를 유발하는 것일 수 있습니다. 모든 것이 여전히 384kb에서 L2에 적합하기 때문에 나쁘지는 않지만 L1 캐시 히트와 L2 캐시 히트 사이에는 쉽게 차이가 쉽게 차이가 있으므로 큰 차이를 만들 수 있습니다.