如何解决带花括号的for循环中迭代器的openMP初始化
我有这个主线:
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}
的语法规则,因此代码不符合。范围循环也具有规范形式,但这不适用于此处。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。