簡體   English   中英

帶花括號的 for 循環中迭代器的 openMP 初始化

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM