Tôi đang viết một chương trình nhân ma trận với OpenMP, để thuận tiện cho bộ đệm, thực hiện phép nhân A x B (chuyển vị) hàng X hàng thay vì cổ điển Một x B hàng x cột, cho hiệu quả bộ nhớ cache tốt hơn. Làm điều này tôi phải đối mặt với một thực tế thú vị cho tôi là vô lý: nếu trong đoạn mã này tôi song song với vòng lặp bên ngoài, chương trình sẽ chậm hơn nếu tôi đặt chỉ thị OpenMP trong vòng lặp bên trong nhất, trong máy tính của tôi thời gian là 10,9 so với 8,1 giây.Phép nhân song song OpenMP bằng phép nhân ba cho vòng lặp (vấn đề hiệu suất)
//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)
}
}
}
Bằng cách tinh chỉnh thông số omp tôi đã có 200% tốc độ trên máy tính của mình. gốc: http://llcomp.googlecode.com/hg/examples/mxm.c hiện tại: http://codepad.org/nSfZHp03 – jfs
Giải pháp tốt.Yeah, OpenMP khá phức tạp – Elalfer
Mã sử dụng bố cục bộ nhớ ''fortran'' cho ma trận' B' chạy nhanh hơn 4-8 (lợi ích lớn nhất) cho ma trận 1000x1000 (phiên bản luồng mất '0,5' giây). https://gist.github.com/790865 – jfs