OpenMP在函数内并行化for循环

时间:2015-10-08 11:57:29

标签: function loops for-loop 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;
}

1 个答案:

答案 0 :(得分:1)

正如@Hristo已经提到的,您不能在OpenMP中跳出并行区域。除了其他原因之外,这是不允许的,因为编译器不能事先知道每个线程在分割for循环时应该处理多少次迭代,就像你在不同线程中编写的那样。

此外,即使您可以从循环中分支出来,您也应该能够看到comparisons计算错误。因此,您有一个固有的串行算法,它会在第一个不同的字符处中断。你怎么能分开这项工作,以便在这个算法上投入更多的线程可能会让它更快?

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