有关我的初步解决方案,请参阅下面的编辑
考虑以下代码:
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
int main(void) {
int counter = 0;
int i;
omp_set_num_threads(8);
#pragma omp parallel
{
int id = omp_get_thread_num();
#pragma omp for private(i)
for (i = 0; i<10; i++) {
printf("id: %d thread: %d\n", i, id);
#pragma omp critical // or atomic
counter++;
}
}
printf("counter %d\n", counter);
return 0;
}
我将线程数定义为 8。对于 8 个线程中的每一个,我希望for
每个单独的线程都有一个循环,该循环会增加变量counter
。但是,OpenMP 似乎并行化了for
循环:
i: 0 thread: 0
i: 1 thread: 0
i: 4 thread: 2
i: 6 thread: 4
i: 2 thread: 1
i: 3 thread: 1
i: 7 thread: 5
i: 8 thread: 6
i: 5 thread: 3
i: 9 thread: 7
counter 10
因此,counter=10
,但我想要counter=80
。我该怎么做才能让每个线程for
在所有线程递增时执行自己的循环counter
?
以下代码给出了预期的结果:
我添加了另一个从 0 循环到最大线程数的外部for
循环。在这个循环中,我可以for
为每个线程声明我的循环私有。确实,counter=80
在这种情况下。这是这个问题的最佳解决方案还是有更好的解决方案?
int main(void) {
omp_set_num_threads(8);
int mthreads = omp_get_max_threads();
#pragma omp parallel for private(i)
for (n=0; n<mthreads; n++) {
int id = omp_get_thread_num();
for (i = 0; i<10; i++) {
printf("i: %d thread: %d\n", i, id);
#pragma omp critical
counter++;
}
}
}
printf("counter %d\n", counter);
return 0;
}