OPEN MP 的指令错误

最近在写 open MP 的程序,今天遇见了一个bug,花了我一个下午加晚上的时间都没有搞定。我反复看了好几遍都没有能够看出来。导致我浪费了很多的时间。

#pragma omp parallel
#pragma  single nowait
  {
    for (int i = 0; i < 10; i++) {
#pragma omp task
      task(i);
    }
    printf("tread num: %d \n", 10083);
  }

我在写如上的一个代码结构,理论上我的程序是没有问题的。但是由于在 #pragma single nowait 少了一个 opm 指令导致自己的程序总是不对。记录下这个bug。
顺便介绍一下task是怎么使用的。

#pragma omp parallel
#pragma omp single nowait
  {
    for (int i = 0; i < 10; i++) {
#pragma omp task
      task(i);
    }
// #pragma omp taskwait
    printf("tread num: %d \n", 10083);
  }

用这样的写法在task(1)处会制造出多个任务,整个程序不会在 block住。这样导致 printf("tread num: %d \n", 10083); 比 task 语句先执行。如果 task 直接相互独立,他们能够并行运算,大大提高效率。

你可能感兴趣的:(OPEN MP 的指令错误)