C 如何进行opemp for循环?

C 如何进行opemp for循环?,c,for-loop,openmp,C,For Loop,Openmp,我有一个非常好的计划ᴄᴘᴜ 密集循环(5000万次呼叫和超过100亿次循环阶段),例如: 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); } } 它在没有openmp的情况下可以完美

我有一个非常好的计划ᴄᴘᴜ 密集循环(5000万次呼叫和超过100亿次循环阶段),例如:

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);
    }
}
它在没有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);
    }
}
用于有序共享(字符串)的pragma omp parallel 对于(inti=0;i这有帮助吗

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);
        }
    }
}
int abort=0;
#用于有序共享的pragma omp并行(字符串,中止)

对于(int i=0;ii在并行版本中,更改
i
将产生不可预测的结果,因为循环的每次迭代都可能由一个单独的线程处理。更改一个线程中的值很可能不会影响其他线程。@MadPhysicator:它对任何线程都没有影响。但我正在寻找替代方法。Tif语句的内容不能移到if语句之外。没错。如果您想正确地跳出循环,您必须能够以某种方式向主线程发送信号。使用
pragma
i=0x7ffffb;
成为一个局部更改,而不会影响外部循环。@madpysicator:我在如何操作中找不到它使用openmp进行。这是问题的主题。为了理解如何使用openmp,肯定需要完整详细的答案。您使用的是什么版本?
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);
        }
    }
}