Đây là mã tôi đã viết:Tăng tốc độ nhân bản ma trận với OpenMP và phương pháp chặn: Tôi có thể làm tốt hơn không?
#include <omp.h>
void matrix_multi(int c[][TSIZE], int a[][TSIZE], int b[][TSIZE])
{
int B=8;
int i, j, k,i1,j1,k1;
#pragma omp parallel for private(i,j,k,i1,j1,k1) schedule(auto) collapse(3)
for (i=0; i<TSIZE; i+=B)
for (j=0; j<TSIZE; j+=B)
for (k=0; k<TSIZE; k+=B)
for (i1=i;i1<i+B;i1++)
for (j1=j;j1<j+B;j1++)
{
int sum=0;
for (k1=k;k1<k+B;k1++)
{
sum+=a[i1][k1]*b[k1][j1];
}
c[i1][j1]+=sum;
}
}
Câu hỏi của tôi là: Tôi có thể có được một hiệu suất tốt hơn với một số thao tác hơn nữa trên ba vòng bên trong?
Bạn đã đo hiệu suất bạn nhận được chưa? Đối với phép nhân ma trận, bạn có thể so sánh với hiệu suất đỉnh lý thuyết. – Zulan
Tôi không tin mã này là chính xác: chỉ thị 'collapse (3)' song song trên 3 chỉ mục 'i',' j' và 'k'. Điều này có nghĩa là bạn được đảm bảo rằng không có cặp 'i, j, k' nào giống hệt nhau sẽ được xử lý bởi hai luồng khác nhau. Tuy nhiên, bạn có thể có cùng cặp 'i, j' với một' k' khác nhau cho hai luồng. Và điều này sẽ dẫn đến tình trạng chạy đua khi cập nhật 'c [i1] [j1]' ... – Gilles
[Video khóa học đặc biệt này] (http://ocw.mit.edu/courses/electrical-engineering-and-computer- science/6-172-performance-engineering-of-software-systems-fall-2010/video-lectures/lecture-1-matrix-multiply-a-case-study /) hoàn toàn dành riêng cho việc cải thiện tốc độ nhân bản ma trận. – displayName