C++ 使用OpenMP的线程数

C++ 使用OpenMP的线程数,c++,c,parallel-processing,openmp,computer-science,C++,C,Parallel Processing,Openmp,Computer Science,目前我正在学习并行计算的课程。我想用特定数量的线程运行一个程序,以检查执行时间的差异。我发现一篇类似的帖子很有帮助,但不幸的是,这个解决方案并没有进一步帮助我。 () () 我的程序代码是: #define SIZE 1000 main () { float A[SIZE][SIZE], b[SIZE], c[SIZE]; int i, j, n; double fTimeStart, fTimeEnd; /* Initializations */ for

目前我正在学习并行计算的课程。我想用特定数量的线程运行一个程序,以检查执行时间的差异。我发现一篇类似的帖子很有帮助,但不幸的是,这个解决方案并没有进一步帮助我。 () ()

我的程序代码是:

#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);
}
#定义尺寸1000
主要()
{
浮动A[大小][大小]、b[大小]、c[大小];
inti,j,n;
双fTimeStart,fTimeEnd;
/*初始化*/
对于(i=0;i
我假设问题在平行区域

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);
fTimeStart=omp_get_wtime();
{
omp_集_动态(0);
omp_设置_数量_线程(4);
#pragma-omp并行
对于(i=0;i
程序的线程数输出为1。这很奇怪,因为我试图将其设置为4

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

编辑:在@igorR的建议之后,将printstatement放入forloop。我也尝试了outerloop,但在重新编译后,我只得到一个print语句,仍然有一个线程

   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);
omp\u set\u动态(0);
omp_设置_数量_线程(4);
#pragma-omp并行
对于(i=0;i
谢谢,
Ter

此程序的输出是什么?为什么您认为它不是用4个线程运行的呢?您可以在并行区域打印它。尝试将printf移动到for循环中。在调试器中运行程序。在for循环内设置断点。检查GDB中的线程(
info threads
),您看到了多少线程?请再次阅读代码。它与代码片段不同。代码没有并行性…我鼓励您养成在所有循环和条件的主体上使用大括号的习惯。有关激励示例,请参见。