首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenMP调度器

OpenMP调度器
EN

Stack Overflow用户
提问于 2015-08-07 17:18:11
回答 1查看 176关注 0票数 0

我对在OpenMP中分发任务有问题。我有下一个代码:

代码语言:javascript
复制
#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 = 1cnt2 = 59。我认为OpenMP调度程序中存在这个问题。还是有什么东西抓不到。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

这表明任务的实例化非常快。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31883304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档