我有这个非常简单的并行代码,我用它来学习 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/