c++ - OpenMP 和内核/线程

标签 c++ parallel-processing cpu openmp memory-bandwidth

我的 CPU 是 Core i3 330M,2 核 4 线程。当我在终端中执行命令 cat /proc/cpuinfo 时,就好像我有 4 个 CPU。当我使用 OpenMP 函数 get_omp_num_procs() 时,我也得到 4。

现在我有一个标准的 C++ vector 类,我的意思是一个不使用表达式模板的固定大小的 double 组类。我仔细地并行化了我类(class)的所有方法,并获得了“预期的”加速。

问题是:在这种简单的情况下,我能猜出预期的加速比吗?例如,如果我添加两个没有并行化 for 循环的 vector ,我会得到一些时间(使用 shell time 命令)。现在,如果我使用 OpenMP,我应该根据内核/线程数将时间除以 2 还是 4?我强调我只要求这个特别简单的问题,其中数据没有相互依赖性并且一切都是线性的( vector 加法)。

这是一些代码:

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;
}

我已经读过这篇文章:OpenMP thread mapping to physical cores .

我希望有人能告诉我更多有关 OpenMP 如何在这个简单的案例中完成工作的信息。应该说我是并行计算的初学者。

谢谢!

最佳答案

编辑:现在已经添加了一些代码。

在那个特定的例子中,计算量很少,内存访问量很大。因此性能将在很大程度上取决于:

  • vector 的大小。
  • 你是如何安排时间的。 (您是否有用于计时目的的外循环)
  • 数据是否已经在缓存中。

对于较大的 vector 大小,您可能会发现性能受到内存带宽的限制。在这种情况下,并行性不会有太大帮助。对于较小的尺寸,线程的开销将占主导地位。如果您获得“预期的”加速,您可能介于最佳结果之间。

我拒绝给出硬性数字,因为一般来说,“猜测”性能,尤其是在多线程应用程序中,是一个失败的原因,除非您事先有测试知识或对程序及其运行的系统有深入了解。

就像我在这里的回答中的一个简单例子:How to get 100% CPU usage 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

如果我使用4 个线程 运行并显式地(使用任务管理器)将线程固定在 4 个不同的物理内核上,结果是:

This machine calculated all 78498 prime numbers under 1000000 in 30.4429 seconds

因此,这表明即使对于一个非常简单且令人尴尬的并行应用程序来说,它也是多么不可预测。涉及大量内存使用和同步的应用程序变得更加丑陋...

关于c++ - OpenMP 和内核/线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9292191/

相关文章:

c++ - .NET 和 C++ 互操作性

C++ 基类列表以及如何确定类类型

mysql - 如何避免将大型文件并行加载到mysql中的超时错误

linux - 为什么最新版本的 sys-stat 在杀死后不显示平均值?

c++ - std::vector 的后代是否可以合并和排序?

c++ - c++中的全局变量错误LNK2020

java - 如何在 Java parallelStream 中使用 print ("\r"+progressMessage)?

c# - 具有并行任务时检测网页的最佳实践

hadoop - Hadoop集群配置资源管理

concurrency - 什么是缓存命中和缓存未命中?为什么上下文切换会导致缓存未命中?