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

时间:2015-03-17 13:57:07

标签: 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); 
} 

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

1 个答案:

答案 0 :(得分:1)

如果您的输入大小只需要几微秒来计算,正如您所说的那样,4个线程不会少于此。实质上,您的输入数据对于并行化而言太小,因为创建线程会产生开销。

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

例如,您可能也会进行虚假共享,但此时无需考虑。

您可以采取哪些措施来提高代码矢量化的性能(但在这种情况下,您无法使用库调用,即您必须自己编写函数)。