[英]openMP initialization of the iterator in the for loop with curly braces
我有這個主要的:
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
限制。 具體來說,所有關聯的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}
語法規則,因此代碼不符合要求。 Range-for 循環也有規范形式,但這不適用於這里。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.