我对在OpenMP中分发任务有问题。我有下一个代码:
#include <stdio.h>
#include <unistd.h>
int cnttotal = 0;
int cnt1 = 0, cnt2 = 0;
int main()
{
int i;
#pragma omp parallel
#pragma omp single nowait
for (i = 0; i < 60; i++) {
if (cnttotal < 1) {
cnttotal++;
#pragma omp task
{
#pragma omp atomic
cnt1++;
usleep(10);
cnttotal--;
}
} else {
#pragma omp task
{
#pragma omp atomic
cnt2++;
sleep(1);
}
}
}
printf("cnt1 = %d; cnt2 = %d\n", cnt1, cnt2);
return 0;
}我会怎么做,cnt1 = 1,cnt2 = 59。我认为OpenMP调度程序中存在这个问题。还是有什么东西抓不到。
发布于 2015-10-08 09:21:45
我的感觉是,您将任务实例化与实际执行任务混为一谈。#杂注omp任务是指任务的实例化,这是非常快的。另一件事是,OpenMP运行时的空闲线程查找就绪任务的列表并执行它。
进入你发布的问题。在这段代码中,一个正在运行的线程(例如T1)进入第一个迭代(i=0),从而进入第一个if,然后将cnttotal设置为1并实例化第一个任务(cnt1)。在该实例化之后,T1继续实例化剩余的任务,而空闲线程(例如T2)执行任务cnt1,任务cnt1取约10 T2,并再次将cnttotal设置为0。
因此,简而言之,实例化任何任务的线程比任务cnt1中的10us执行速度更快。
例如,在我的Intel(R) Core(TM) i7-2760QMCPU@ 2.40GHz中,如果我更改了代码,使循环运行到i= 500,并睡眠1 us (us休眠(1)),我得到:
cnt1 = 2;cnt2 = 498
这表明任务的实例化非常快。
https://stackoverflow.com/questions/31883304
复制相似问题