Ben*_*min 5 c++ parallel-processing cpu openmp memory-bandwidth
我的CPU是Core i3 330M,有2个内核和4个线程.当我/proc/cpuinfo在终端中执行命令cat 时,就好像我有4个CPUS.当我使用OpenMP功能时,get_omp_num_procs()我也得到4.
现在我有一个标准的C++矢量类,我的意思是一个不使用表达式模板的固定大小的双数组类.我仔细并行化了我班级的所有方法,并获得了"预期"的加速.
问题是:在这么简单的情况下,我能猜出预期的加速吗?例如,如果我添加两个没有并行化for循环的向量,我会得到一些时间(使用shell time命令).现在,如果我使用OpenMP,根据内核/线程的数量,我应该将时间除以2或4吗?我强调我只是要求这个特别简单的问题,即数据中没有相互依赖性,一切都是线性的(向量加法).
这是一些代码:
Vector Vector::operator+(const Vector& rhs) const
{
assert(m_size == rhs.m_size);
Vector result(m_size);
#pragma omp parallel for schedule(static)
for (unsigned int i = 0; i < m_size; i++)
result.m_data[i] = m_data[i]+rhs.m_data[i];
return result;
}
Run Code Online (Sandbox Code Playgroud)
我已经阅读过这篇文章:OpenMP线程映射到物理核心.
我希望有人会告诉我更多有关OpenMP如何在这个简单案例中完成工作的信息.我应该说我是并行计算的初学者.
谢谢!
编辑:现在已经添加了一些代码。
在该特定示例中,计算量非常少,内存访问量却很大。因此,性能将在很大程度上取决于:
对于较大的向量大小,您可能会发现性能受到内存带宽的限制。在这种情况下,并行性不会有太大帮助。对于较小的尺寸,线程的开销将占主导地位。如果您获得了“预期”加速,则可能处于最佳结果之间。
我拒绝给出确切的数字,因为一般来说,“猜测”性能(尤其是在多线程应用程序中)是不可能的,除非您事先具有测试知识或对程序及其运行的系统有深入的了解。
正如我的回答中的一个简单示例:How to get 100% CPU use from a C program
在 Core i7 920 @ 3.5 GHz(4 核,8 线程)上:
如果我用4 个线程运行,结果是:
This machine calculated all 78498 prime numbers under 1000000 in 39.3498 seconds
Run Code Online (Sandbox Code Playgroud)
如果我使用4 个线程运行并显式(使用任务管理器)将线程固定在 4 个不同的物理核心上,结果是:
This machine calculated all 78498 prime numbers under 1000000 in 30.4429 seconds
Run Code Online (Sandbox Code Playgroud)
因此,这表明即使对于一个非常简单且令人尴尬的并行应用程序来说,它也是多么不可预测。涉及大量内存使用和同步的应用程序变得更加丑陋......