Function 函数内部循环的OpenMP并行化

Function 函数内部循环的OpenMP并行化,function,loops,for-loop,openmp,Function,Loops,For Loop,Openmp,我正在尝试使用OpenMP在函数内并行化for循环,但是当我编译代码时,仍然有一个错误=( 错误1错误C3010:“返回”:不允许跳出OpenMP结构化块

我正在尝试使用OpenMP在函数内并行化for循环,但是当我编译代码时,仍然有一个错误=(

错误1错误C3010:“返回”:不允许跳出OpenMP结构化块

<我使用Visual Studio 2010 C++编译器。有人能帮助我吗?我很感激任何建议。

int match(char* pattern, int patternSize, char* string, int startFrom, unsigned int &comparisons) {
    comparisons = 0;
#pragma omp for 
    for (int i = 0; i < patternSize; i++){
        comparisons++;
        if (pattern[i] != string[i + startFrom])
            return 0;
    }
    return 1;
}
int匹配(char*pattern、int-patternSize、char*string、int-startFrom、无符号int和比较){
比较=0;
#pragma omp for
对于(int i=0;i
正如@Hristo已经提到的,不允许您在OpenMP中从并行区域分支。除其他原因外,这是不允许的,因为编译器无法事先知道每个线程在拆分for循环时应该进行多少次迭代,就像您在不同线程之间编写的那样

此外,即使您可以分支出循环,您也应该能够看到,
比较
的计算可能不正确。实际上,您有一个固有的串行算法,在第一个不同的字符处中断。您如何将这项工作拆分,以便在该算法上添加更多线程可能会使其更快


最后,请注意,在这个循环中所做的工作非常少。即使您可以将此算法重写为并行算法,您也不太可能看到OpenMP的任何好处。我的建议是:将OpenMP从这个循环中删除,并在其他地方实现它(在更高的级别上-可能在不同的字符串上调用此方法?-或者在代码中做更多工作的部分中)。

OpenMP中不允许从并行区域分支。标准的4.0版添加了几个所谓的取消构造,允许提前终止(取消)不幸的是,Visual Studio只支持OpenMP 2.0版。@HristoIliev,如果你能展示一个用OpenMP 2.0实现这一点的黑客来回答OPs问题,然后展示如何用OpenMP 4.0实现这一点,我将不胜感激。我对OpenMP 4.0解决方案不太熟悉。@Zboson,我不得不想一想。但这对sur来说会很难看e、 ..如果您有一组要测试的模式,您可以在上面使用OpenMP,这可能需要动态调度。OpenMP在这里唯一有用的方法是,如果字符串和模式在长时间运行时可能相等。例如,假设它是一组布尔值,您想计算某个范围内布尔值的数量。