我有一个for循环,执行大约需要16 ms,并且在另一个for循环下有条件地执行500次。
串行代码格式如下:
//Outer for loop
for(i=0;i<500;i++){
//read some entity
//some conditions
// some function calls
// some nested function calls
// inner for loop
for (j=0;some condition;j++){
// work on the entity read in outer for loop
}
}
我想并行化内部for循环。是否可以通过使用OpenMP将执行内部for循环所需的时间减少40%,从而减少运行串行代码所需的总时间?
我希望减少总时间来执行代码。在我的情况下,并行外部for循环是不可能的,因为代码被编写为一次只读取一个实体来处理 它在内部循环中。
请帮忙。
谢谢!
答案 0 :(得分:0)
Openmp可以解决这些小任务的问题。我曾经做过一次在30 fps视频上做5x5内核过滤器。
您应该测试最佳粒度。如果将任务分成两部分,则开销最小,但限制了并行性。如果粒度太高,loop ovrhead会变大,你可能会从不同的内核写入相邻的内存位置,这会破坏缓存性能。
在上面的例子中,我将图像划分为扫描线,每个扫描线都按顺序计算。这很好。