令人尴尬的并行代码的性能较低

Low performance for an Embarrassingly parallel code

本文关键字:性能 代码 并行      更新时间:2023-10-16

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

#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 乘以 288 矩阵的 sgemm(矩阵乘法)的 Visual Studio 上,内核 = 1 的 350 微秒和内核 = 4 的 1177 微秒,这似乎只是一个顺序代码。我将英特尔 MKL 属性设置为并行(也使用顺序测试),并将语言设置设置为生成并行代码 (/Qopenmp)。无论如何要改善这一点?我正在运行四核处理器

如果你的输入大小只需要几微秒来计算,正如你所说,4个线程不可能比这少。本质上,输入数据太小,无法并行化,因为创建线程会产生开销。

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

例如,您可能还会有虚假共享,但在这一点上,这没有什么可考虑的。

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