我应该并行化哪些循环,外部循环或内部循环

时间:2014-02-18 13:56:12

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

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

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

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

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

我认为问题可能更为笼统:更快,为每个线程提供大量操作,或者创建多个操作很少的线程。

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

您的目标是在可用处理器上均匀分布数据。您应该将每个处理器核心的一个线程均匀地向上分割(外部循环)。 尝试细粒度和粗粒度的平行度,看看哪种效果最好。一旦您的线程数超过可用内核数,您将开始看到性能下降。

答案 2 :(得分:3)

  

什么是更快,为每个线程提供大量操作,或创建多个操作的线程

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

它还取决于您的算法:如果您经常访问磁盘/内存,则会经常挂起线程,因此最好再使用一些线程。