我有一个定义了所有变量的for循环
#pragma omp parallel for
for(long long l = 1; l<=sqrtt; l++) ...
当我使用Visual Studio 2012中的/openmp
命令行选项编译它时,它给了我
error C3017: termination test in OpenMP 'for' statement has improper form
我不知道为什么'for' statement has improper form
。
对于OpenMP的语句,正确是什么?如何将其应用于我的for循环?
答案 0 :(得分:3)
OpenMP 3.1标准为 for-loop 构造规定了一种非常严格的形式(参见第39页):
for (init-expr; test-expr; incr-expr) structured-block
特别是,test-expr
必须如下所示:
var relational-op b
b relational-op var
其中 relational-op 是<,<=,>,>=
之一,而b
是循环不变与var类型兼容的类型的表达式。
除此之外,您必须确保:
相关循环的循环控制表达式的值 对于所有线程,循环结构必须相同 队。
所以,回到你的情况,我会检查sqrtt
是一个循环不变量,并为所有线程都有相同的值。
long long
在C ++中并不是标准的,例如在SO上查看this question。
答案 1 :(得分:3)
我遇到了同样的问题。我有这个:
#pragma omp parallel for
for(int i = 0; i < stop; i++){
//My code
}
然后我发现问题是我的变量stop
是 double ,所以,在我的情况下我需要stop
是 double < / em>,我不得不做一个演员:
#pragma omp parallel for
for(int i = 0; i < (int)stop; i++){
//My code
}
然后一切顺利:)
我希望这可以提供帮助。