내 코드에서 일부 최적화를 수행하고 있습니다. 우선 OpenMP로 병렬 프로그래밍을 진행했습니다. 그런 다음 GNU GCC 컴파일러가 제공하는 최적화 플래그를 사용했습니다. 또한 역 제곱근을 계산하는 SSE 명령도 포함되었습니다. 하지만 마지막으로 문제는 각 스레드가 결과를 축소 변수에 쓸 때 마지막 작업이 ~ 80 %의 시간이 걸린다는 것입니다. 여기서 병렬 루프 :OpenMP에서 감소가 매우 느림
rsqrtSSE()을 기반으로 __mm_rsqrt_ps 함수 (__ M128의 X) xmmintrin.h의 소정 함수가time(&t5);
# pragma omp parallel for shared(NTOT) private(dx,dy,d,H,V,E,F,G,K) reduction(+:dU)
for(j = 1; j <= NTOT; j++){
if(!(j-i)) continue;
dx = (X[2*j-2]-X[2*i-2])*a;
dy = (X[2*j-1]-X[2*i-1])*a;
d = rsqrtSSE(dx*dx+dy*dy);
H = D*d*d*d;
V = dS[0]*spin[2*j-2]+dS[1]*spin[2*j-1];
E = dS[0]*dx+dS[1]*dy;
F = spin[2*j-2]*dx+spin[2*j-1]*dy;
G = -3*d*d*E*F;
K = H*(V+G);
dU += K;
}
time(&t6);
t_loop = difftime(t6, t5);
. 이 문제를 해결할 수있는 해결책이 있다면? 또는 이것은 대역폭 제한 때문입니까?
은 내가 GCC -o 음식물을 prog.c -lm -fopenmp -03 컴파일 - ffast - 수학 -march = 네이티브 여기
내 컴퓨터에 대한 몇 가지 정보를 정기적으로 : 아키텍처 : (x86_64의 CPU 연산 모드의) : 32 비트, 64 비트 바이트 순서 : 리틀 엔디안 CPU : 4 온라인 CPU 목록 : 0-3 코어 당 스레드 : 2 코어 당 소켓 : 2 소켓 : 1 NUMA 노드 : 1 공급 업체 ID : GenuineIntel CPU 제품군 : 6 모델 : 69 01 23,516,모델명 : 인텔 (R) 코어 (TM) i5-4200U CPU에서 @의 1.60GHz 스테핑 1 CPU 메가 헤르츠 : 849.382 CPU 최대 메가 헤르츠 : 800.0000 밉스 : 4589.17 가상화 : VT-X MHz의 분 2600.0000 CPU L1D 캐쉬 : 32K L1i 캐시 : 32K L2 캐시 : 256K L3 캐시 : 3072K NUMA의 node0의 CPU (들) : CPU Avg_MHz %의 바쁜 Bzy_MHz의 TSC_MHz - 2,294 99.97 :
및 turboboost와 0-3 2300 2295 0 2295 100.00 2300 2295 1 2295 100.00 2300 2295 2 2292 99.87 2300 2295 3 2295 100.00 2300 2295
기타 좋은 질문이 몇 가지 빠져 있습니다. 마지막 라인이 80 %의 시간을 소비한다고 어떻게 결정 했습니까? 실제로 여러 스레드를 고려할 때는 시간이 무엇을 의미합니까? 하나의 스레드 VS의 성능은 무엇입니까? 듀얼 코어 시스템에 두 개의 스레드가 있습니까? 'NTOT '는 얼마나 큰가요? 일반적으로 [mcve]는 귀하의 질문에 실질적으로 답변 할 수 있도록 많은 도움을줍니다. – Zulan
나는 time_t 유형 (시간차를 쓰는 것)을 사용하는 것이 NTOT = 6400이고 크기가 6400X1000 인 다른 루프가 있다는 것을 알았습니다. 이 루프에서 경과 된 시간은 dU + = K 인 경우 160 초이고이 시간이없는 경우는 30 초입니다. 전체 코드를 작성할 수 없습니다. 그것은 372 라인입니다. 코어 당 2 개의 스레드이기 때문에 4 개의 스레드를 사용할 수 있습니다. 물론 2는 1과 4보다 2보다 좋습니다. –
편집 : dU + = K 없이는 10 초 미만입니다 –