微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

OpenMP的线程数

如何解决OpenMP的线程数

目前,我正在学习并行计算课程。我想运行一个具有特定数量线程的程序,以检查执行时间会有什么不同。我发现类似的帖子对您​​有所帮助,但不幸的是,该解决方案并不能进一步帮助我。 (OpenMP set_num_threads() is not working) (openmp for block error

我的程序的代码是:

#define SIZE 1000


main ()
{

   float A[SIZE][SIZE],b[SIZE],c[SIZE];
   int i,j,n;
   double fTimeStart,fTimeEnd;

   /* Initializations */
   for (i=0; i < SIZE; i++)
   {
     for (j=0; j < SIZE; j++)
         /* fminf(x,y) gives the minimum of x and y  */
       A[i][j] = fminf(i*1.0/(j+1.0),j*1.0/(i+1.0));
     b[i] = 1.0 * (i+1);
     c[i] = 0.0;
   }

   fTimeStart = omp_get_wtime();


   omp_set_num_threads(4);
   #pragma omp for schedule(static)
   for (i=0; i < SIZE; i++)
       for (j=0; j < SIZE; j++)
           c[j] = c[j] + A[j][i] * b[i];
    printf("threads: %d\n",omp_get_num_threads());


   fTimeEnd = omp_get_wtime();
   printf("  wall clock time     = %.20f\n",fTimeEnd - fTimeStart);
}

我认为问题出在并行区域。

fTimeStart = omp_get_wtime();


   {
   omp_set_dynamic(0);
   omp_set_num_threads(4);
   #pragma omp parallel for
    for (i=0; i < SIZE; i++)
        for (j=0; j < SIZE; j++)
            c[j] = c[j] + A[j][i] * b[i];
    printf("threads: %d\n",omp_get_num_threads());
   }


   fTimeEnd = omp_get_wtime();
   printf("  wall clock time     = %.20f\n",fTimeEnd - fTimeStart);

关于线程数的程序输出为1。这很奇怪,因为我尝试将其设置为4。

问题:为什么程序不能在4个线程中执行?

编辑:建议@igorR将printstatement放入forloop中。我也在外部循环中尝试过,但是重新编译后,我只得到一个打印语句,仍然是一个线程。

   omp_set_dynamic(0);
   omp_set_num_threads(4);
   #pragma omp parallel for
    for (i=0; i < SIZE; i++)
        for (j=0; j < SIZE; j++)
            c[j] = c[j] + A[j][i] * b[i];
            n = omp_get_num_threads();
            printf("threads: %d",n);

谢谢, Ter

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。