我有并行扫描算法: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;
// ...
}
}
// ...
答案 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;
// ...
}
}
此外,请注意,您可能可以删除firstprivate
,N
和m
的{{1}}子句,如果您不这样做,请将其更改为offset
在并行循环中修改。
shared
仅限于#pragma omp parallel for
或int
,因为以下代码在gcc 4.8.5和icc 16.0.3中无懈可击
unsigned int
答案 1 :(得分:0)
omp parallel for 中的迭代变量被限制为int或unsigned int。 long long不是有效的迭代器类型。
见