令人尴尬的并行代码的性能较低
Low performance for an Embarrassingly parallel code
我有这个非常简单的并行代码,我用它来学习令人尴尬的并行。但是,我没有得到预期的超线性或至少线性性能提升。
#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个线程不可能比这少。本质上,输入数据太小,无法并行化,因为创建线程会产生开销。
尝试增加输入数据,以便花费几秒钟的时间并重复实验。
例如,您可能还会有虚假共享,但在这一点上,这没有什么可考虑的。
您可以做些什么来提高性能,即矢量化代码(但在这种情况下,您不能,因为您正在使用库调用,即您必须自己编写函数)。
相关文章:
- GCC 和 Clang 代码性能的巨大差异
- 如何使用本征提高性能?(包括示例代码)
- 在.cpp文件中定义方法而不是在 C++ 的 .h 文件中定义方法时,如何提高代码的性能?
- 使用 const double* const 作为模板参数 - 代码性能问题
- 如何在没有性能命中的情况下抽象SIMD代码来处理不同的数据类型
- 为什么 C++ 代码实现的性能不比 python 实现更好?
- 如何提高此 OpenCL 缩减内核代码的性能?
- 相同的代码在不同的 gcc 编译器中存在巨大的性能差异
- 如何基准C 代码的性能
- 相同的代码执行两次:性能差异
- 附加到 C++/CLI dll 的性能探查器无法访问本机C++代码
- 牢记干净的代码的性能,什么更好
- 在将其尺寸较大的向量移动到容量较小的向量之前,是否可以通过使用Reserve()来提高代码性能
- 如何提高四叉树代码的性能以防止程序冻结
- C++多线程性能比单线程代码慢
- 在C++代码中使用纯 C 库是否有性能下降/损失
- 如何使用QueryPerformanceCounter测试现有代码的性能
- 公开类的内部组件,以防止编写过多代码和影响性能
- 从编译器优化和代码性能的角度来看,"if constexpr"与"if"
- C++按字符串调用函数,比较PHP的性能,如何在C++中优化代码