OpenMP consruct schedule(static [,chunk])

时间:2014-08-11 10:22:13

标签: c openmp

我在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);
    }
  }
}

1 个答案:

答案 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);
}
相关问题