我在8核机器上运行这个程序。对于Hello
的某些值,我得到的输出包含超过2 World
或超过2 ID
。当我使用schedule(static,2)
时,每个线程应该只运行2次迭代。谁能告诉我为什么会这样?提前谢谢。
#include<omp.h>
#include<stdio.h>
void main()
{
int ID,nthreads;
#pragma omp parallel
{
int i;
nthreads=omp_get_num_threads();
#pragma omp for schedule(static,2)
for(i=0;i<16;i++)
{
ID=omp_get_thread_num();
printf("Hello(%d)\n",ID);
printf("World(%d)\n",ID);
}
}
}
答案 0 :(得分:0)
执行for
循环的次数与没有OpenMP的次数相同。每次执行时,都会打印消息。打印它的线程和有多少线程并不重要。 for
循环OpenMP工作共享只是意味着打印消息n
次的工作在线程之间划分,但传递次数仍然存在。
请注意,您拥有ID
变量的竞争条件。你应该将它设为私有或在循环内声明它。打印时,变量的值可能具有无意义的值。在循环中声明它:
#pragma omp for schedule(static,2)
for(i=0;i<16;i++)
{
int ID=omp_get_thread_num();
printf("Hello(%d)\n",ID);
printf("World(%d)\n",ID);
}
或
int ID=omp_get_thread_num();
#pragma omp for schedule(static,2) private(ID)
for(i=0;i<16;i++)
{
printf("Hello(%d)\n",ID);
printf("World(%d)\n",ID);
}