C3015:OpenMP 'for'语句中的初始化格式不正确
C3015: initialization in OpenMP 'for' statement has improper form
我有并行扫描算法:Hillis &Steele(1986)和我想要执行内部for循环并行。
Error C3015 initialization in OpenMP 'for' statement has improper form OpenMP c:usersmatjadocumentsvisual studio 2015projectspsseminaropenmpmain.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, OP发布的错误是在OpenMP for没有完全明确时引发的。这可能是因为编译器不能完全理解语句
所使用的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
和offset
,并将它们更改为shared
。
BTW,我不同意tahini的回答,他们声称#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 = %dn", omp_get_thread_num(), m);
}
}
对于的omp并行中的迭代变量被限制为int型或unsigned int型。long类型的long不是一个有效的迭代器类型。
看https://computing.llnl.gov/tutorials/openMP/ParallelRegion
相关文章:
- 内部结构初始化不起作用 - C++
- 初始化不是整数的巨大常量多维数组的最佳方法是什么?
- C++ 类型 'complex<double>' 中类中的复杂初始化不提供调用运算符
- 有没有办法初始化不涉及编写构造函数的新结构变量?
- 如何初始化不是静态的const成员
- 当INT初始化为浮动点值时,为什么填充初始化不会给出错误
- C++:unique_ptr初始化不正确
- 初始化不能从const char [3]转换为std :: string *
- 模板专用化的实例化不正确
- 聚合初始化不支持构造函数访问
- 结构的动态聚合初始化的正确形式
- 静态初始化不安全调用的线程安全
- 使用初始化列表的 POD 类型初始化不起作用
- C++:如何初始化不是整型的静态成员变量
- 初始化不正确的价值不良样式后,正在抛出异常
- C++11 数组初始化不会调用复制构造函数
- POD变量的直接初始化不起作用,但当将变量推到向量上时,复制初始化起作用
- 一堆变量正在取消初始化.不知道该怎么办
- 确保全局变量的初始化顺序正确
- 是否可以保证静态初始化不会覆盖显式初始化的值