我试图在使用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;
}
答案 0 :(得分:1)
正如@Hristo已经提到的,您不能在OpenMP中跳出并行区域。除了其他原因之外,这是不允许的,因为编译器不能事先知道每个线程在分割for循环时应该处理多少次迭代,就像你在不同线程中编写的那样。
此外,即使您可以从循环中分支出来,您也应该能够看到comparisons
计算错误。因此,您有一个固有的串行算法,它会在第一个不同的字符处中断。你怎么能分开这项工作,以便在这个算法上投入更多的线程可能会让它更快?
最后,请注意,无论如何,在此循环中完成的工作很少。即使您可以将此算法重写为并行算法,您也不太可能从OpenMP中看到任何好处。我的建议:从这个循环中删除OpenMP并查看在其他地方实现它(或者在更高级别 - 或者你可以在不同的字符串上调用此方法? - 或者在代码中执行更多工作的部分)。