C++ C3015:OpenMP和x27中的初始化;对于';陈述的形式不恰当

C++ C3015:OpenMP和x27中的初始化;对于';陈述的形式不恰当,c++,c,visual-studio,visual-c++,openmp,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 我以前从未经历过这个错误,我在谷歌上搜索过,但没有发现任何有用的东西 包括: #inclu

我有并行扫描算法: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
我以前从未经历过这个错误,我在谷歌上搜索过,但没有发现任何有用的东西

包括:

#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;
        // ...
    }
}
// ...
/。。。
用于(长m=0;m
omp parallel for中的迭代变量被限制为int或无符号int。long long不是有效的迭代器类型


根据MSDN,当未完全明确说明的OpenMP时,将引发OP POST的错误。这可能是因为编译器不完全理解语句使用的C99语言

for (long long n = offset; n < N; n++)
此外,请注意,如果不在并行循环中进行修改,您可能可以去掉
N
m
offset
firstprivate
子句,并将它们更改为
shared

顺便说一句,我不同意塔希尼的回答,他们声称
#pragma omp parallel for
被限制为
int
unsigned int
,因为以下代码在gcc 4.8.5和icc 16.0.3中都能正常工作

#include <omp.h>
#include <stdio.h>
void main (void)
{
    long long m;

    #pragma omp parallel for schedule
    for (m = 0; m < 16; m++)
    {
            printf ("thread = %d, m = %d\n", omp_get_thread_num(), m);
    }
}
#包括
#包括
真空总管(真空)
{
长m;
#pragma omp并行调度
对于(m=0;m<16;m++)
{
printf(“thread=%d,m=%d\n”,omp\u get\u thread\u num(),m);
}
}

我希望int64\t能够在合适的平台上工作,但我认为这不是一个可移植的期望。即使它能工作,在没有硬件支持的平台上也可能会很慢。你可能想比较一下,是内环并行还是外环并行更快。有些人也使用SIMD,测试多种方法是很常见的。这个答案是不正确的。简单地检查例子29。从MSVC不支持OpenMP超过2,它使C(这里限制到C89)和C++之间的区别。在VS2017中,似乎有更多的C89支持,但这个痛苦的问题仍然存在。VS2019也有同样的问题。必须使用C89变量声明,即使对于int也是如此。
#include <omp.h>
#include <stdio.h>
void main (void)
{
    long long m;

    #pragma omp parallel for schedule
    for (m = 0; m < 16; m++)
    {
            printf ("thread = %d, m = %d\n", omp_get_thread_num(), m);
    }
}