【发布时间】:2014-11-19 09:26:07
【问题描述】:
OpenMP 手册说
declare reduction指令中的类型名称不能是函数类型、数组类型、引用类型或用const、volatile或restrict限定的类型。
如何将结果生成到数组元素中?我开始了:
int main()
{
// create an input array
static const int snum = 5000;
int input[snum];
for(int i=0; i<snum; ++i){
input[i] = i+1;
}
// shared output variables for reduction
int sum[2];
sum[0] = 0;
sum[1] = 0;
#pragma omp parallel for
#pragma omp declare reduction(+:sum[0])
#pragma omp declare reduction(+:sum[1])
for(int i=0; i<snum; ++i) {
int* p = input+i;
if(i%2==0)
sum[0] += *p;
else
sum[1] += *p;
}
}
这会导致编译器错误:
27013152.cpp:16:9: error: ‘#pragma’ is not allowed here #pragma omp declare reduction(+:sum[0]) ^~~ 27013152.cpp:17:33: error: ‘sum’ does not name a type #pragma omp declare reduction(+:sum[1]) ^~~ 27013152.cpp:17:36: error: expected ‘:’ before ‘[’ token #pragma omp declare reduction(+:sum[1]) ^
【问题讨论】:
-
你的问题是什么?我不明白。上面的代码不会编译,你不能“这样做”。
-
你要做什么?你为什么不把你的
input分成两个数组,比如并减少每个数组? (基于奇数或偶数) -
其实,我想对表做一个聚合,每列都是一个数组。所以我需要扫描表并进行聚合。但是 Openmp 似乎不支持使用数组减少指令后的名称。那么,如何使用 openmp 并行化我的聚合代码?thx
标签: c++ arrays openmp reduction