gpt4 book ai didi

c - 是否可以在孤立的 C 例程中使用来自指针传递参数的归约变量?

转载 作者:行者123 更新时间:2023-11-30 18:11:05 25 4
gpt4 key购买 nike

我试图在 C 中的孤立例程中使用一个归约变量。我意识到我需要通过指向例程的指针传递变量,以确保它被视为共享(它在封闭的并行区域中共享) 。然而,当我尝试编译时,编译器不喜欢变量是指针这一事实(我认为),并提示它没有指针的归约类型,即使用 cray 编译器时,我收到此错误:

CC-1642 craycc: ERROR File = main.c, Line = 33
The OpenMP reduction clause does not accept pointer or reference types.
#pragma omp for reduction(+:sum)

使用此示例代码时:

#include<stdio.h>
#include<stdlib.h>
#include<omp.h>

int myroutine(double *, double *, int);

int main(void){

double a[100];
double sum;
int i;
int n = 100;

for(i=0;i<n;i++){
a[i]=3.2;
}


#pragma omp parallel shared(a,n,sum)
{
myroutine(a, &sum, n);
}

printf("sum = %lf\n",sum);

return 0;
}

int myroutine(double *a, double *sum, int n){

int i;

#pragma omp for reduction(+:sum)
for(i=0;i<n;i++){
*sum += a[i];
}

return 0;

}

我需要从传递的指针变量到局部变量进行一些复制吗?或者还有其他方法可以实现这一目标吗?

最佳答案

int myroutine(double *a, double *sum, int n)
{
int i;
static double localSum = *sum;

#pragma omp for reduction(+:localSum)
for(i=0;i<n;i++){
localSum += a[i];
}
*sum = localSum;

return 0;
}

可以工作,但是很恶心而且很可怕,因为如果您在嵌套并行区域中的不同团队中尝试它,它就会崩溃。 (尽管如果您不使用嵌套并行性,并且不从独立的 pthread 启动 OpenMP,那么它是安全的,这几乎是同一件事!)

我希望有类似的事情

 #pragma omp for reduction(+:sum[0])

可以在 OpenMP 5.0 中工作,其中支持减少数组部分,但不幸的是编译器可能还没有(可以理解,因为规范尚未最终确定!)

关于c - 是否可以在孤立的 C 例程中使用来自指针传递参数的归约变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52333881/

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