我正在编写一个图像处理过滤器,我想使用openmp来加速计算。我的伪代码结构如下:
for(every pixel in the image){
//do some stuff here
for(any combination of parameters){
//do other stuff here and filter
}
}
代码使用不同的参数过滤每个像素,并选择最佳参数。
我的问题是什么更快:在处理器之间并行化第一个循环,或顺序访问像素并并行化不同的参数选择。
我认为问题可能更为笼统:更快,为每个线程提供大量操作,或者创建多个操作很少的线程。
我现在不关心实现细节,我想我可以使用openmp以前的专业知识来处理它们。谢谢!
答案 0 :(得分:4)
在线程创建和调度中往往会有大量的无意中听到。通常,您希望为每个线程提供足够的工作,以便创建新线程的开销被引入多线程的“胜利”所吸收。
此外,假设您有足够多的像素,最好确保每个线程按顺序访问像素。更适合在操作系统级别进行缓存,并确保数据已经在您希望的位置。从内存中重复加载也会损害您的并行化胜利。
答案 1 :(得分:4)
您的目标是在可用处理器上均匀分布数据。您应该将每个处理器核心的一个线程均匀地向上分割(外部循环)。 尝试细粒度和粗粒度的平行度,看看哪种效果最好。一旦您的线程数超过可用内核数,您将开始看到性能下降。
答案 2 :(得分:3)
什么是更快,为每个线程提供大量操作,或创建多个操作的线程
创建新线程需要大量的时间和资源,因此最好创建一些任务较长的线程。
它还取决于您的算法:如果您经常访问磁盘/内存,则会经常挂起线程,因此最好再使用一些线程。