OpenMP를 사용하여 행렬 곱셈을위한 프로그램을 작성했습니다. 캐시 편의를 위해 A x B (전치 행) 행 대신 X 행을 사용합니다. A x B rows x columns. 캐시 효율을 향상시킵니다. 이렇게하는 것은 흥미로운 사실입니다.이 코드에서 extern 루프를 병렬 처리하면 프로그램에서 OpenMP 지시문을 가장 안쪽 루프에 넣는 것보다 속도가 느립니다. 컴퓨터에서 시간은 10.9 vs 8.1 초입니다. 당신이 외부 루프를 병렬화 컴파일러는 그것을 알아낼 수없는 추가 잠금 장치를 추가 할 때OpenMP 병렬 처리 트리플에 의한 행렬 곱셈 (성능 문제)
//A and B are double* allocated with malloc, Nu is the lenght of the matrixes
//which are square
//#pragma omp parallel for
for (i=0; i<Nu; i++){
for (j=0; j<Nu; j++){
*(C+(i*Nu+j)) = 0.;
#pragma omp parallel for
for(k=0;k<Nu ;k++){
*(C+(i*Nu+j))+=*(A+(i*Nu+k)) * *(B+(j*Nu+k));//C(i,j)=sum(over k) A(i,k)*B(k,j)
}
}
}
omp 매개 변수를 조정하면 내 컴퓨터에서 200 % 속도가 향상됩니다. 원본 : http://llcomp.googlecode.com/hg/examples/mxm.c 현재 : http://codepad.org/nSfZHp03 – jfs
좋은 해결책.예, OpenMP는 좀 까다 롭습니다 – Elalfer
''B' 행렬에''fortran ''메모리 레이아웃을 사용하는 코드는 1000x1000 행렬 (스레드 버전은'0.5' 초 걸립니다)에 대해 4-8 빠르게 실행됩니다 (최대 이점). https://gist.github.com/790865 – jfs