我运行了串行和并行化的矩阵乘法代码。并行版本没有显着改进。
dimension =4000;
//#pragma omp parallel for shared(A,B,C) private(i,j,k)
{
for(int i=0; i<dimension; i++){
for(int j=0; j<dimension; j++){
for(int k=0; k<dimension; k++){
C[i][j] += A[i][k] * B[k][j];
}
}
}
}
输出: 时间./a.out
real 4m58,760s
user 4m58,706s
sys 0m0,036s
用于串口代码(我把#pragma ...放在注释中,其余代码相同) 我得到了以下输出
real 4m51,240s
user 4m51,210s
sys 0m0,024s
答案 0 :(得分:0)
您需要使用-fopenmp
编译代码才能使pragma正常工作。此外,您不需要注释pragma以在没有OpenMP的情况下运行,只是不要使用OpenMP进行编译。
使用OpenMP:gcc -fopenmp -o a.out code.c
没有OpenMP:gcc -o a.out code.c
答案 1 :(得分:0)
除非这是一个(选择不当)的教育示例,否则请不要编写自己的矩阵并将其并行化。从矩阵乘法中获得最佳性能涉及其他优化(矢量化,缓存阻塞),这需要时间来写入并且难以正确。
一如既往,&#34;最好的代码是我不必编写的代码&#34;所以去抓一个BLAS库的副本(例如,Intel MKL现在是免费的)。
我知道编写代码比阅读手册更有趣,但有时后者更有效率!
完整披露:我为英特尔工作,但不在MKL工作。