最近在写 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 直接相互独立,他们能够并行运算,大大提高效率。