【问题标题】:Which loops should I parallelize, the outer or the inner ones我应该并行化哪些循环,外部的还是内部的
【发布时间】:2014-03-18 08:04:45
【问题描述】:

我正在编写一个图像处理过滤器,我想使用 openmp 加快计算速度。我的伪代码结构如下:

for(every pixel in the image){
    //do some stuff here
    for(any combination of parameters){
        //do other stuff here and filter
    }
}

代码使用不同的参数过滤每个像素,并选择最佳的。

我的问题是什么更快:并行化处理器之间的第一个循环,或者顺序访问像素并并行化不同的参数选择。

我认为这个问题可能是一个更笼统的问题:什么更快,给每个线程大量的操作,或者用很少的操作创建很多线程。

我现在不关心实现细节,我想我可以用我以前使用 openmp 的专业知识来处理它们。谢谢!

【问题讨论】:

  • “哪个更快?”的答案总是一样的。 两种方法都试一下,你就知道了。我们无法比您更好地看到未来。
  • 感谢@EricLippert,这是有道理的。但是我的算法非常复杂,而且我处理的图像非常大,所以我认为提出我的具体问题,然后将其作为一个更“一般”的问题提出,对我来说可能会节省时间,对其他人有用
  • 顺便说一下,如果你使用线程池和现有的线程,线程创建开销不会那么重要。如果您的程序通常已经是多线程程序,则应该是这种情况。
  • @Anthony:如果你真正的问题是复杂和困难的,那就更有理由期望互联网上的陌生人会猜错。

标签: c++ c multithreading parallel-processing openmp


【解决方案1】:

您的目标是在可用处理器上平均分配数据。您应该使用每个处理器核心一个线程均匀地拆分图像(外循环)。 试验细粒度和粗粒度并行性,看看什么能提供最好的结果。一旦您的线程数超过可用内核数,您将开始看到性能下降。

【讨论】:

  • 这也可以帮助缓存局部性 - 例如4 个 CPU,每个 CPU 缓存中有 25% 的像素与 4 个 CPU,每个 CPU 缓存中有 100% 的像素
【解决方案2】:

什么是更快,给每个线程大量的操作,或者用很少的操作创建很多线程

创建一个新线程需要大量时间和资源,因此最好创建几个线程较长的任务。

这还取决于您的算法:如果您过于频繁地访问磁盘/内存,线程将频繁挂起,因此最好使用更多线程。

【讨论】:

  • 最好的方法是创建不太多但与确切数量的任务完全一样多的任务
【解决方案3】:

在线程创建和调度方面往往会被大量偷听。通常,您希望为每个线程提供足够的工作,以使创建新线程的开销被引入多线程的“胜利”所吸收。

此外,假设您有足够多的像素,最好确保每个线程按顺序访问像素。更适合在操作系统级别进行缓存,并确保数据在您想要的位置。反复从内存加载也会损害您的并行化胜利。

【讨论】:

    猜你喜欢
    • 2021-01-05
    • 2018-03-17
    • 2010-09-13
    • 2014-03-24
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    相关资源
    最近更新 更多