【问题标题】:How to get OpenMP to work with #pragma omp task?如何让 OpenMP 与 #pragma omp 任务一起工作?
【发布时间】:2021-06-07 00:32:36
【问题描述】:

我在 Linux 终端上使用 OpenMP。我用标志-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 I am thread # %d\n", omp_get_thread_num()); 以显示程序正在以三个线程运行。基本上omp_get_thread_num() 应该返回值 0、1 或 2。

The Output 上面的代码块被重复调用了很多次。然而,每次的结果都显示线程不工作,程序只使用一个线程(线程 0)。

【问题讨论】:

    标签: c++ c multithreading parallel-processing openmp


    【解决方案1】:

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

    尝试以下方法:

    #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);
                }
            }
    }
    

    但是每次的结果都显示线程不是 工作,程序只使用一个线程(线程 0)。

    如果你想检查它是否被多线程调用,请改用omp_get_num_threads,它返回团队的线程数。

       #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 master      
          printf("Total Threads # %d\n", omp_get_num_threads()); 
          #pragma omp single
          compute_inverse(...); // First call to the recursive function
       }
    

    在compute_inverse函数内部:

       #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);
       }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-03
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-20
      • 1970-01-01
      相关资源
      最近更新 更多