c++ - 令人尴尬的并行代码的低性能

标签 c++ parallel-processing openmp intel-mkl embarrassingly-parallel

我有这个非常简单的并行代码,我用它来学习 openmp,它是令人尴尬的并行。但是,我没有得到预期的超线性或至少线性性能提升。

#pragma omp parallel num_threads(cores) 
{
   int id = omp_get_thread_num(); 
   cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, row, column, column, 1.0, MatrixA1[id], column, MatrixB[id], column, 0.0, Matrixmultiply[id], column); 
} 

在使用英特尔 C++ 编译器 xe 15.0 和计算 288 x 288 矩阵的 sgemm(矩阵乘法)的 Visual Studio 上,我得到 cores=1 的 350 微秒和 cores=4 的 1177 微秒,这看起来就像一个顺序代码。我将英特尔 MKL 属性设置为并行(也使用顺序测试)并将语言设置设置为生成并行代码 (/Qopenmp)。无论如何要改善这个? 我在四核 Haswell 处理器中运行

最佳答案

如果您的输入大小只需要几微秒就可以计算出来,正如您所说,那么 4 个线程所花的时间绝不会少于此。从本质上讲,您的输入数据对于并行化来说太小了,因为创建线程会产生开销。

尝试增加输入数据,以便花费几秒钟并重复实验。

例如,您可能还会有虚假共享,但此时无需考虑。

你可以做些什么来提高性能,那就是向量化代码(但在这种情况下你不能,因为你正在使用库调用,即你必须自己编写函数)。

关于c++ - 令人尴尬的并行代码的低性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29100967/

相关文章:

c++ - MFC 功能区主页按钮双击关闭应用程序

c++ - Sublime text 3 - 编译程序并在终端运行

haskell - 如何测量 Haskell 程序的顺序和并行运行时间

c# - 使用 Cray aprun 命令运行单声道应用程序

c++ - 用于加速器的 OpenMP 4.0 : Nvidia GPU target

c++ - 使用 helgrind : False positive? 提升 asio http async_client 示例警告

使用 pthreads 在 C 中将顺序循环转换为并行循环

c - OpenMP 任务和线程创建

c++ - 为什么添加两个 std::vector 比从 new[] 中添加原始数组慢?

c++ - 在 Clang AST 中存储 Decl 节点