0

我有这个非常简单的并行代码,我用它来学习令人尴尬的并行 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 上,我得到 350 微秒的核心 = 1 和 1177 微秒的核心 = 4,这看起来就像一个顺序代码。我将英特尔 MKL 属性设置为并行(也使用顺序测试),将语言设置设置为生成并行代码 (/Qopenmp)。无论如何要改善这一点?我在四核 haswell 处理器中运行

4

1 回答 1

1

如您所说,如果您的输入大小只需要几微秒来计算,那么 4 个线程所花费的时间是不可能的。从本质上讲,您的输入数据对于并行化来说太小了,因为创建线程有开销。

尝试增加输入数据,以便花费一些时间并重复实验。

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

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

于 2015-03-17T15:19:28.400 回答