C++ 如何让OpenMP与#pragma omp任务一起工作?

C++ 如何让OpenMP与#pragma omp任务一起工作?,c++,c,multithreading,parallel-processing,openmp,C++,C,Multithreading,Parallel Processing,Openmp,我正在使用OpenMP和Linux终端。我用标志-fopenmp编译我的程序。我使用的环境确实支持多线程 #pragma omp parallel num_threads(3) { #pragma omp task R11Inverted = compute_inverse(r11, half); #pragma omp task printf("5 I am thread # %d\n&q

我正在使用OpenMP和Linux终端。我用标志
-fopenmp
编译我的程序。我使用的环境确实支持多线程

    #pragma omp parallel num_threads(3)
    {
        #pragma omp task
            R11Inverted = compute_inverse(r11, half);
        #pragma omp task
            printf("5 I am thread # %d\n", omp_get_thread_num());
            R22Inverted = compute_inverse(r22, half);
    }
作为一个简单且最低限度的测试,我所要做的就是获取
printf(“5我是线程#%d\n”,omp_get_thread_num())以显示程序正在使用三个线程运行。基本上,
omp\u get\u thread\u num()
应该返回值0、1或2


上面的代码块被多次重复调用。但是,每次的结果都显示线程没有工作,程序只使用一个线程(线程0)。

您缺少代码块周围的{}以及单个子句

请尝试以下操作:

#pragma omp parallel num_threads(3)
{
        #pragma omp single
        {
            #pragma omp task
               R11Inverted = compute_inverse(r11, half);
            #pragma omp task
            {
              printf("5 I am thread # %d\n", omp_get_thread_num());
              R22Inverted = compute_inverse(r22, half);
            }
        }
}
   #pragma omp parallel num_threads(3)
   {
      #pragma omp master      
      printf("Total Threads # %d\n", omp_get_num_threads()); 
      #pragma omp single
      compute_inverse(...); // First call to the recursive function
   }
然而,每次的结果都表明,线程不是 正在工作,并且程序仅使用单个线程(线程0)

如果要检查是否由多线程调用,则使用,这将返回团队需要的线程数

   #pragma omp parallel num_threads(3)
   {
            #pragma omp master
            {           
                printf("Total Threads # %d\n", omp_get_num_threads()); 
            }
            #pragma omp single
            {
                #pragma omp task
                   R11Inverted = compute_inverse(r11, half);
                #pragma omp task
                {
                  printf("5 I am thread # %d\n", omp_get_thread_num());
                  R22Inverted = compute_inverse(r22, half);
                }
            }
    }

如果上面的代码是递归调用的,那么您需要适应以下情况:

#pragma omp parallel num_threads(3)
{
        #pragma omp single
        {
            #pragma omp task
               R11Inverted = compute_inverse(r11, half);
            #pragma omp task
            {
              printf("5 I am thread # %d\n", omp_get_thread_num());
              R22Inverted = compute_inverse(r22, half);
            }
        }
}
   #pragma omp parallel num_threads(3)
   {
      #pragma omp master      
      printf("Total Threads # %d\n", omp_get_num_threads()); 
      #pragma omp single
      compute_inverse(...); // First call to the recursive function
   }
在计算逆函数中:

   #pragma omp task
   R11Inverted = compute_inverse(r11, half);
   #pragma omp task
   {
      printf("5 I am thread # %d\n", omp_get_thread_num());
      R22Inverted = compute_inverse(r22, half);
   }
不客气,是的,当然可以:)。但是通常您应该在之后删除它们,因为它们与线程无关