当变量是数组元素时,我可以使用 OpenMP 缩减吗?
Can I use OpenMP reduction when the variable is an array element?
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]) ^
你弄
错了你得到的错误。这并不意味着你不能对交替元素进行减少。这意味着您无法将缩减为数组的元素。
也就是说,你不能做reduction(+:sum[0])
.但是你可以将约简化为另一个标量变量,然后复制到数组的元素中:
void sum_int(const int input[], int num, int *sum)
{
int sum_even = 0, sum_odd = 0;
#pragma omp parallel for reduction(+:sum_even) reduction(+:sum_odd)
for (int i = 0; i < num; i++) {
if (i % 2 == 0)
sum_even += input[i];
else
sum_odd += input[i];
}
sum[0] = sum_even;
sum[1] = sum_odd;
}
从 OpenMP 4.5 开始,现在可以减少 C/C++ 中的数组。基本上,您必须指定数组部分(请参阅 OpenMP 4.5 规范的第 2.4 节,第 44 页)。您的 #pragma 规范如下所示:
#pragma omp parallel reduction(+:sum[:2])
但是要小心,您必须意识到每个线程都会分配自己的数组部分版本;如果你这样做具有许多线程的数组,您将使您的内存需求爆炸式增长。
相关文章:
- 是否可以使C++类成为Objc类的委托
- 是否可以使一个类成为两个不同层次结构的子类?
- 是否有编译器标志可以使较新的 gcc 版本像旧版本一样构建
- C 可以使destuructor不称为班级成员和基类攻击方的灾难
- 可以使未命名的结构静态
- 是否可以使整数仅收到一个单个数字而不是两个接收输入
- C++:有哪些常规方法可以使代码更有效地用于大数字
- 是否可以使 std 容器使用默认运算符为新?
- LD_BIND_NOW可以使可执行文件运行得更慢?
- 是否可以使头文件使文本居中?- 在控制台中
- 有什么方法可以使核心忙碌等待
- 有没有一种技术可以使虚函数在所有派生类中强制重写?
- 有没有一种方法可以使全局函数/静态成员函数一次可呼出
- 是否有一种方法可以使此C 14递归模板在C 17中短
- 编写一个可以使二维数组平坦的函数
- 有哪些优化技巧可以使我的代码运行得更快
- 有没有更好的方法可以使此代码线程安全?线程局部静态似乎是一个生硬的工具
- 如果必须在同一向量上写入线程,是否可以使用线程
- 对于具有两个模板化变量的模板化类,是否可以使一个 var 引用另一个 var
- C 中的内容可以使Windows 8应用程序不在手臂上运行