programing

C코드 루프 퍼포먼스 [계속]

goodsources 2022. 8. 15. 21:40
반응형

C코드 루프 퍼포먼스 [계속]

이 질문은 여기서도 계속됩니다(신비의 조언에 따라).

C코드 루프 퍼포먼스


이어서 스칼라 명령 대신 패킹된 명령어를 사용할 경우 내장 함수를 사용하는 코드는 매우 비슷해 보입니다.

for(int i=0; i<size; i+=16) {
    y1 = _mm_load_ps(output[i]);
    …
    y4 = _mm_load_ps(output[i+12]);

    for(k=0; k<ksize; k++){
        for(l=0; l<ksize; l++){
            w  = _mm_set_ps1(weight[i+k+l]);

            x1 = _mm_load_ps(input[i+k+l]);
            y1 = _mm_add_ps(y1,_mm_mul_ps(w,x1));
            …
            x4 = _mm_load_ps(input[i+k+l+12]);
            y4 = _mm_add_ps(y4,_mm_mul_ps(w,x4));
        }
    }
    _mm_store_ps(&output[i],y1);
    …
    _mm_store_ps(&output[i+12],y4);
    }

이 커널의 측정된 성능은 사이클당 약 5.6FP 동작이지만, 스칼라 버전의 정확히 4배(사이클당 4.1,6=6,4FP ops)가 될 것으로 예상됩니다.

중량 계수의 이동을 고려하면(그것을 지적해 주셔서 감사합니다), 스케줄은 다음과 같습니다.

스케쥴

않은 것 만, 그 뒤에 .movss후 XMM을 하는 조작shufps이 스칼라 값을 벡터 전체에 복사합니다.는 이제 가 된 것 .mulps부하에서 부동소수점 도메인으로의 스위칭 지연 시간을 고려하여 추가 지연 시간이 발생하지 않도록 합니다.

movaps move (aligned, packed move), (aligned, packed move)addps&mulps이 커널에서 사용되는 명령어(어셈블리 코드 체크)는 스칼라 버전과 동일한 레이텐시와 스루풋을 가지므로 이 경우에도 레이텐시가 추가되지 않습니다.

이 커널이 사이클당 6.4FP ops를 얻을 수 있고 사이클당 5.6FP ops로 실행된다고 가정할 때 8사이클당 추가 사이클이 어디에 사용되는지 알고 있는 사람이 있습니까?


참고로 실제 어셈블리는 다음과 같습니다.

…
Block x: 
  movapsx  (%rax,%rcx,4), %xmm0
  movapsx  0x10(%rax,%rcx,4), %xmm1
  movapsx  0x20(%rax,%rcx,4), %xmm2
  movapsx  0x30(%rax,%rcx,4), %xmm3
  movssl  (%rdx,%rcx,4), %xmm4
  inc %rcx
  shufps $0x0, %xmm4, %xmm4               {fill weight vector}
  cmp $0x32, %rcx 
  mulps %xmm4, %xmm0 
  mulps %xmm4, %xmm1
  mulps %xmm4, %xmm2 
  mulps %xmm3, %xmm4
  addps %xmm0, %xmm5 
  addps %xmm1, %xmm6 
  addps %xmm2, %xmm7 
  addps %xmm4, %xmm8 
  jl 0x401ad6 <Block x> 
…

Vtune에서 EMON 프로파일링을 사용하거나 oprof와 같은 동등한 툴을 사용해 보십시오.

EMON ( Event Monitoring )프로파일링 = >은 시간 기반 툴과 비슷하지만 어떤 퍼포먼스 이벤트가 문제의 원인인지 알 수 있습니다.다만, 우선 시간 베이스의 프로파일로부터 개시해, 특정의 순서가 튀어나오지 않는지를 확인해 주세요(또, 그 IP로 폐기 스톨이 발생한 빈도를 나타내는 관련 이벤트도 참조할 수 있습니다).

EMON 프로파일링을 사용하려면 "일반적인 용의자"에서 "..."까지의 이벤트 목록을 확인해야 합니다.

캐시 미스, 정렬부터 시작하겠습니다.사용하고 있는 프로세서에 RF 포트 제한에 대한 카운터가 있는지는 알 수 없지만, EMON 프로파일링을 오래 전에 추가했습니다.마이크로 아키텍처에 적합한 이벤트를 추가함으로써 EMON이 얼마나 잘 대응하고 있는지 알 수 없습니다.

프론트 엔드, 명령 가져오기, 정지일 수도 있습니다.이 명령어에는 몇 바이트가 들어있습니까?EMON 이벤트도 있어요.


Nehalem VTune이 L3 이벤트를 볼 수 없다는 코멘트에 대한 응답: true가 아닙니다.다음은 코멘트에 추가했지만 맞지 않는 내용입니다.

실제로 LL3 / L3$ / 이른바 Uncore에 대한 ARE 성능 카운터가 있습니다.만약 VTune이 그들을 지원하지 않는다면 나는 매우 놀랄 것이다.http://software.intel.com/sites/products/collateral/hpc/vtune/performance_analysis_guide.pdf은 VTune 및 기타 툴(PTU 등)을 가리킵니다.David Levintal이 말한 것처럼 LL3 이벤트가 없는 경우에도 마찬가지입니다."인텔™Core®i7 프로세서는 Itanium®프로세서 패밀리 Data EAR 이벤트와 매우 유사한 이벤트"가 있습니다.이 이벤트는 로드를 샘플링하여 명령 실행과 실제 데이터 전달 사이의 사이클 수를 기록합니다.측정된 지연 시간이 MSR 0x3f6에 프로그램된 최소 지연 시간(비트 15:0)보다 클 경우 카운터가 증가합니다.카운터 오버플로는 PEBS 메커니즘을 활성화하고 지연 임계값을 충족하는 다음 이벤트가 발생하면 측정된 지연, 가상 또는 선형 주소 및 데이터 소스가 PEBS 버퍼의 3개의 추가 레지스터에 복사됩니다.가상 주소는 기존의 장소에 캡처되기 때문에 샘플링 드라이버는 가상에서 물리로의 변환을 실행하여 물리 주소를 캡처할 수도 있습니다.물리적 주소는 NUMA 홈 위치를 식별하고 기본적으로 캐시 점유율의 세부 정보를 분석할 수 있습니다."또한 35페이지에서 L3 CACHE_와 같은 VTune 이벤트를 가리키고 있습니다.히트_UNCORE_HIT 및 L3 CASHE_MISS_REMOTE_DRAM.숫자 코드를 찾아 VTune의 하위 레벨 인터페이스에 프로그래밍해야 할 때도 있지만, 이 경우 예쁜 사용자 인터페이스로 볼 수 있다고 생각합니다.


네, http://software.intel.com/en-us/forums/showthread.php?t=77700&o=d&s=lr에서 러시아의 VTune 프로그래머(내 생각엔)가 Uncore 이벤트에 대해 샘플링을 할 수 없는 "실행"을 하고 있습니다.

그는 틀렸습니다.예를 들어 CPU를 1개만 활성화하여 의미 있는 샘플링을 할 수 있습니다.또, L3는 CPU에 데이터를 반환할 때 L3에 마크를 붙일 수 있다고 생각합니다.실제로 L3는 데이터를 반환할 CPU를 인식하고 있기 때문에, 반드시 샘플을 채취할 수 있습니다.어떤 하이퍼스레드인지 모를 수도 있지만 다시 디세블로 하면 싱글스레드 모드로 전환할 수 있습니다.

하지만, 이 작업을 수행하려면 VTune이 아닌 AROUND VTune을 사용해야 할 것 같습니다.

먼저 지연 시간 프로파일링을 시도하십시오.이는 전적으로 CPU 내부에 있기 때문에 VTune 사용자가 너무 많이 망치지는 않을 것입니다.

다시 한 번 말하지만, 문제는 L3이 아니라 핵심에 있습니다.그래서 VTune은 그것을 처리할 수 있어야 합니다.


Levinthal의 "Cycle Accounting"을 사용해 보십시오.

언급URL : https://stackoverflow.com/questions/10007243/c-code-loop-performance-continued

반응형