gpt4 book ai didi

c++ - C3015 : initialization in OpenMP 'for' statement has improper form

转载 作者:搜寻专家 更新时间:2023-10-31 01:34:39 24 4
gpt4 key购买 nike

我有并行扫描算法: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;
// ...
}
}
// ...

最佳答案

根据 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 的正确标志(事实上,维基百科声称支持 ins 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;
// ...
}
}

此外,请注意,您可能可以摆脱 Nmoffsetfirstprivate 子句如果您不在并行循环中修改,则将它们更改为 shared

顺便说一句,我不同意 tahini 的回答,他们声称 #pragma omp parallel for 仅限于 intunsigned 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);
}
}

关于c++ - C3015 : initialization in OpenMP 'for' statement has improper form,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38941157/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com