带花括号的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}的语法规则,因此代码不符合。范围循环也具有规范形式,但这不适用于此处。