首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何打开一个操作循环?

如何打开一个操作循环?
EN

Stack Overflow用户
提问于 2015-12-24 13:59:45
回答 1查看 675关注 0票数 6

对于循环,我有一个非常密集的ᴄᴘᴜ(5000万个呼叫和100多个双离子循环阶段),例如:

代码语言:javascript
复制
for(int i=0;i<*string;i++){
    if(!check_some_stuff(string+i)) {
        do_some_stuff(i,string-2);
        if(!string)
            break;
       do_yet_other_stuff(string);
    }
}

由于#pragma omp parallel for odered不允许break语句,所以我认为可以将i设置为一个非常大的值。

代码语言:javascript
复制
for(int i=0;i<*string;i++){
    if(!check_some_stuff(string+i)) {
        do_some_stuff(i,string-2);
        if(!string)
            i=0x7FFFFFFB;
       do_yet_other_stuff(string);
    }
}

完全没有开胸的效果。但是当我加上

代码语言:javascript
复制
#pragma omp parallel for ordered shared(string)
for(int i=0;i<*string;i++){
    if(!check_some_stuff(string+i)) {
        do_some_stuff(i,string-2);
        #pragma omp critical
        if(!string)
            i=0x7FFFFFFB; // it seems the assignment has no effect on the value of i.
       do_yet_other_stuff(*string);
    }
}

i的值似乎没有变化,因此它变成了一个无限循环。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-27 05:09:40

这个有用吗?

代码语言:javascript
复制
int abort = 0;
#pragma omp parallel for ordered shared(string, abort)
for(int i=0;i<*string;i++)
{
    #pragma omp flush(abort)
    if(!abort)
    {
        if(!check_some_stuff(string+i))
        {
            #pragma omp flush(abort)
            if(!abort) do_some_stuff(i,string-2);
            if(!string) abort = 1;
            #pragma omp flush(abort)
            if(!abort) do_yet_other_stuff(*string);
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34453935

复制
相关文章

相似问题

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