错误 C3017:OpenMP 'for' 语句中的终止测试形式不正确

nim*_*son 3 c++ parallel-processing for-loop openmp visual-studio-2012

我有一个定义了所有变量的 for 循环

#pragma omp parallel for
for(long long l = 1; l<=sqrtt; l++) ...
Run Code Online (Sandbox Code Playgroud)

当我使用/openmpVisual Studio 2012 中的命令行选项编译它时,它给了我

error C3017: termination test in OpenMP 'for' statement has improper form
Run Code Online (Sandbox Code Playgroud)

我不知道为什么'for' statement has improper form

什么是OpenMP的正确语句?如何将其应用于我的 for 循环?

Mas*_*ano 6

所述的OpenMP 3.1标准规定了在一个非常严格的形式for循环构建体(见pag.39):

for (init-expr; test-expr; incr-expr) structured-block
Run Code Online (Sandbox Code Playgroud)

特别是,test-expr必须看起来像以下之一:

var relational-op b
b relational-op var
Run Code Online (Sandbox Code Playgroud)

其中,relational-op是其中之一,<,<=,>,>=并且b是与 var 类型兼容的类型的循环不变表达式。

除此之外,您必须确保:

与循环构造关联的循环的循环控制表达式的值对于组中的所有线程必须相同。

所以,回到你的情况,我会检查sqrtt是否是循环不变的,并且所有线程都具有相同的值。

一个小小的旁注

long long在 C++11 之前的 C++ 中不是标准的,例如参见SO 上的这个问题