C3015:在OpenMP中初始化'对于'声明有不正确的形式

时间:2016-08-14 10:07:29

标签: c++ c visual-studio visual-c++ openmp

我有并行扫描算法:Hillis& Steele(1986)和我想执行内部for循环并行。

Error   C3015   initialization in OpenMP 'for' statement has improper form  OpenMP  c:\users\matja\documents\visual studio 2015\projects\psseminar\openmp\main.c

之前我从未经历过这个错误,我已经用Google搜索过,但没有发现任何有用的内容。

包括:

#include <omp.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <limits.h>
#include <windows.h>

代码块:

// ...
for (long long m = 0; m < M; m++)
{
    long long offset = (long long)pow(2, m);

    #pragma omp parallel for firstprivate(N, m, offset)
    for (long long n = offset; n < N; n++)
    {
        long long ai = n - offset;
        long long bi = n;
        // ...
    }
}
// ...

2 个答案:

答案 0 :(得分:3)

根据MSDN,当OpenMP for未完全解释时,会发出OP发布的错误。这可能是因为编译器不完全理解语句

使用的C99语言
for (long long n = offset; n < N; n++)

尽管我没有Visual C ++编译器,但我发现gcc 4.8.5和icc 16.0.3无法编译它,需要使用适当的C99语言变体编译代码(即-std=c99) 。谷歌搜索后我没有找到MSVC的正确标志(事实上,维基百科声称MSVC 2013的支持有限(见https://en.wikipedia.org/wiki/C99))。因此,您可以尝试的另一种方法是将该代码转换为

long long m;

for (m = 0; m < M; m++)
{
    long long offset = (long long)pow(2, m);
    long long n;

    #pragma omp parallel for firstprivate(N, m, offset)
    for (n = offset; n < N; n++)
    {
        long long ai = n - offset;
        long long bi = n;
        // ...
    }
}

此外,请注意,您可能可以删除firstprivateNm的{​​{1}}子句,如果您不这样做,请将其更改为offset在并行循环中修改。

顺便说一句,我不同意tahini的答案,他们声称shared仅限于#pragma omp parallel forint,因为以下代码在gcc 4.8.5和icc 16.0.3中无懈可击

unsigned int

答案 1 :(得分:0)

omp parallel for 中的迭代变量被限制为int或unsigned int。 long long不是有效的迭代器类型。

https://computing.llnl.gov/tutorials/openMP/#ParallelRegion