我努力调整一个程序来使用OpenMP。我有一组嵌套的for循环。最外层的for循环是一个y轴循环,它沿着图像向下移动.我想在循环中运行多个并行线程,但我在快速实现它时遇到了困难。
目前,当我运行8个线程时,它的运行方式如下:
thread 0 -> row 0,8,16...
thread 1 -> row 1,9,17...
thread 2 -> row 2,10,18...
thread 3 -> row 3,11,19...我希望它在块中运行,这样线程0就可以执行前1/8行。做这件事最好的方法是什么?
当前代码:
...
int y_percent = data_size_Y/8;
int thread = 0;
#pragma omp parallel for num_threads(8) firstprivate(vecs, bufferedOut,data_size_X, data_size_Y, kern_cent_X, kern_cent_Y, sum)
for(int y = y_percent*omp_get_thread_num(); y < (omp_get_thread_num()+1)*y_percent; y++){ // the y coordinate of theoutput location we're focusing on 发布于 2013-11-03 15:47:13
您可以在杂注语句上使用schedule子句来指定希望每个线程处理的块大小。在下面的示例中,我指定了具有static大小的chunk调度方法,该方法指定每个线程应该获得的连续迭代次数。在这个简单的例子中,每个线程将得到每个8次迭代的块(例如,线程0将得到迭代0-7,线程1迭代8-15,等等)。值得指出的是,如果您不关心块分布的顺序(例如,如果您不关心线程0是否获得第一个块),则可以使用static替换dynamic。dynamic提供了将块分配给需要的线程的能力,而不是从一开始就将块预先分配给线程(当某些迭代比其他迭代花费更长的时间时,对于负载平衡非常有用)。有关调度方法的更多信息,请参见以下内容:
示例:
#include <stdlib.h>
#include <stdio.h>
#include <omp.h>
int main() {
int i;
int iterations = 32;
int num_threads = 4;
#pragma omp parallel for schedule(static, 8) num_threads(num_threads)
for(i=0; i<iterations; i++) {
printf("thread %d: %d\n", omp_get_thread_num(), i);
}
}发布于 2013-11-03 05:11:00
您可以简单地使用以下代码来实现这一点。
#pragma omp parallel for num_threads(8)
for(int y = 0; y < data_size_Y; y++) {
....
}一般来说,我认为firstprivate的长列表是不必要的。根据具体使用这些变量的方式,大多数变量应该能够定义为shared。
https://stackoverflow.com/questions/19749137
复制相似问题