C++ c++;omp原子捕获-语法?
非常简单的代码,看不出为什么编译器在使用C++ c++;omp原子捕获-语法?,c++,openmp,C++,Openmp,非常简单的代码,看不出为什么编译器在使用omp原子捕获时抛出错误 //我的班级 class my_class { my_class() { } static int class_int; static int get_next_int(); }; //my_class.cpp int my_class::get_next_int() { int next_int; #pragma omp atomic capture next_int = class_int++; r
omp原子捕获时抛出错误
//我的班级
class my_class
{
my_class()
{ }
static int class_int;
static int get_next_int();
};
//my_class.cpp
int my_class::get_next_int()
{
int next_int;
#pragma omp atomic capture
next_int = class_int++;
return next_int;
}
编译器错误:
my_class.cpp: In static member function 'static int
my_class::get_next_int()':
my_class.cpp:2069: error: expected end of line before 'capture'
my_class.cpp:2070: error: invalid operator for '#pragma omp atomic' before '=' token
它可能与静态
有关吗?我无法想象为什么
如果我改用pragma omp critical
,那么它工作正常(没有编译器错误)
PS I have#将
包含在所有.h和.cpp中。我会像往常一样链接到-fopenmp
,如果您使用的是Microsoft编译器,它不支持omp-atomic
指令
将代码更改为just#pragma omp atomic
,根据ms文档,编译器将做正确的事情。使我怀疑。:) OpenMP 3.1中引入了capture
子句。您需要一个兼容的编译器:
- 自v4.7以来的GCC
- 自v10.1以来的英特尔编译器
- 自v12.3以来的Oracle Solaris Studio
- 除了
- MSVC(所有版本,包括2012),不支持高于2.0的OpenMP版本
GCC 4.4.5不支持OpenMP 3.1。它只支持OpenMP 3.0。@CycoMatto:您的gcc是否支持capture子句?我在4.8ish gcc变更日志中看到了它。我这里没有Linux机器可以检查了…:)哇!我想我应该检查一下显而易见的事实。显然,我认为capture
足够基本,编译器/版本无关紧要。