我正在学习OpenACC,偶然发现了NVidia提供的雅可比迭代的下面的代码。据我所知,reduction(max:err)为每个循环迭代创建一个私有err变量,并从所有循环迭代中返回最大值。
我的问题是,为什么要使用err = max(err, abs(Anew[j][i] - A[j][i]);,特别是max()函数,而reduction似乎自己就能做到这一点?
while ( err > tol && iter < iter_max )
{
err=0.0;
#pragma acc kernels reduction(max:err)
for( int j = 1; j < n-1; j++)
{
for(int i = 1; i < m-1; i++)
{
Anew[j][i] = 0.25 * (A[j][i+1] + A[j][i-1] + A[j-1][i] + A[j+1][i]);
err = max(err, abs(Anew[j][i] - A[j][i]);
}
}
#pragma acc kernels
for( int j = 1; j < n-1; j++)
{
for( int i = 1; i < m-1; i++ )
{
A[j][i] = Anew[j][i];
}
}
iter++; }
发布于 2020-12-03 01:34:57
"max“函数从单次迭代的参数中获取最大值。最大值减少会在所有迭代中找到最大值。
https://stackoverflow.com/questions/65099225
复制相似问题