如何打破循环的opemp?

时间:2015-12-24 13:59:46

标签: c for-loop openmp

我有一个非常ᴄᴘᴜ密集的(5000万次调用和超过100亿次循环阶段) for循环,例如:

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设置为非常大的值。

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);
    }
}

完美无需openmp。但是当我添加

#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的值似乎没有改变,因此它变成了无限循环。

1 个答案:

答案 0 :(得分:1)

这有帮助吗?

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);
        }
    }
}