문제

내 코드의 내부 루프가 하드웨어 디자인 장벽에 부딪 치거나 내 부분 장벽에 대한 이해 부족 여부를 알아 내려고 노력할 때. 조금 더 많지만 대답하기 위해 내가 생각해 낼 수있는 가장 간단한 질문은 다음과 같습니다.

다음 코드가있는 경우 :

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 캐시 히트 사이에는 쉽게 차이가 쉽게 차이가 있으므로 큰 차이를 만들 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top