最近在寫 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);
}
我在寫如上的一個代碼結(jié)構(gòu),理論上我的程序是沒有問題的铜跑。但是由于在 #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 語句先執(zhí)行。如果 task 直接相互獨立坦弟,他們能夠并行運算护锤,大大提高效率。