矩阵乘法并行化实现(OpenMP)

时间:2018-03-15 17:43:52

标签: c multithreading parallel-processing openmp

我运行了串行和并行化的矩阵乘法代码。并行版本没有显着改进。

    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

2 个答案:

答案 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工作。