问题描述
我有这个主线:
int main() {
std::size_t n{10000};
std::vector<int> A(n);
for (size_t k{0}; k < 10000; ++k) { // repeating the same task over and over again.
#pragma omp parallel default(shared)
{
#pragma omp for
for (size_t i = 0; i < n; ++i) {
A[i] = i;
}
}
}
return 0;
}
我有以下问题,使用列表初始化程序(花括号)的初始化无效:
这有效
for (size_t i = 0; i < n; ++i) {
A[i] = i;
}
这不是
for (size_t i{0}; i < n; ++i) {
A[i] = i;
}
你知道为什么吗?有人告诉我应该总是用花括号初始化,而不是=
或普通花括号( )
。
我在CLion上使用MinGW,并将关于OpenMP的CMake修复为:
FIND_PACKAGE(OpenMP required)
if (OPENMP_FOUND)
set(CMAKE_C_FLAGS "${OpenMP_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
endif()
解决方法
OpenMP 5.0 API不允许以下构造:
#pragma omp for
for (size_t i{0}; i < n; ++i) {
A[i] = i;
}
第2.9.2节说:
for
指令对所有关联的for
循环的结构施加了限制。具体而言,所有关联的for
循环都必须具有规范循环形式(请参阅第95页的2.9.1节)。
第2.9.1节说:
与循环关联的指令关联的循环如果符合以下条件,则具有规范循环形式:
---------------- for (init-expr;test-expr;incr-expr) structured-block ---------------- init-expr One of the following: var=lb integer-type var=lb random-access-iterator-type var=lb pointer-type var=lb
没有适用于size_t i{0}
的语法规则,因此代码不符合。范围循环也具有规范形式,但这不适用于此处。