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와 같은 동등한 툴을 사용해 보십시오.
- Linux용 Vtune (Windows 버전을 검색할 수 있습니다)
- opro 파일
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
'programing' 카테고리의 다른 글
getter 및 setter와 함께 localcomputed 함수의 Vuex 구문 오류 (0) | 2022.08.15 |
---|---|
Java의 네이티브 키워드는 무엇입니까? (0) | 2022.08.15 |
Vuex에서의 디바운스 사용방법 (0) | 2022.08.15 |
Vuex: 복잡한 객체 및 상태 변경 기능 사용 (0) | 2022.08.15 |
C 구조 상속 포인터 정렬 (0) | 2022.08.15 |