【发布时间】:2016-09-14 10:29:42
【问题描述】:
这是我写的代码:
#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;
}
}
我的问题是:我可以通过对三个内部循环进行进一步操作来获得更好的性能吗?
【问题讨论】:
-
您测量过您获得的性能吗?对于矩阵乘法,您可以与理论峰值性能进行比较。
-
我不相信这段代码是正确的:
collapse(3)指令平行于 3 个索引i、j和k。这意味着您可以保证两个不同的线程不会处理相同的i,j,k三元组。但是,对于两个线程,您很可能拥有相同的i,j对和不同的k。这将导致更新c[i1][j1]... -
This particular course video 完全致力于提高矩阵乘法的速度。
-
我强烈建议你使用这个 stackExchange,专门用于这些情况:codereview.stackexchange.com
标签: c parallel-processing openmp matrix-multiplication