gpt4 book ai didi

c++ - 在嵌套循环中使用 OpenMP reduction 子句

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

我有函数的当前版本:

    void*
function(const Input_st *Data, Output_st *Image)
{
int i,j,r,Offset;
omp_set_num_threads(24);
#pragma omp parallel for schedule(static) shared(Data,Image),\
private(i,j,r,Offset)
for (i = 0; i < Data->NX; i++)
{
for (j = 0; j < (Data->NZ); j++)
{
for (r = 0; r < Data->NR; r++)
{
Offset = i*Data->NR*Data->NZ + j*Data->NR + r;
Image->pTime[Offset] = function2()
}
}
}
return NULL;
}

它工作得很好,但是我想删除变量 Offset 的计算和使用指向成员 Image->pTimeR 的指针然后递增,如下所示:

    void*
function(const Input_st *Data, Output_st *Image)
{
int i, j, r;
double *pTime = Image->pTime;
omp_set_num_threads(24);
#pragma omp parallel for schedule(static) shared(Data,Image),\
private(i,j,r)
for (i = 0; i < Data->NX; i++)
{
for (j = 0; j < (Data->NZ); j++)
{
for (r = 0; r < Data->NR; r++)
{
*pTime = function2()
pTime++;
}
}
}
return NULL;
}

我得到段错误。我假设我需要使用 reduction 子句,例如 reduction(+:pTime)

  1. 首先,这里的目的是加速功能,我想知道这样的改变是否会显着加速? (比如使用更少的缓存内存?)
  2. 其次,我尝试对其进行基准测试但失败了!我认为这里的问题可以通过使用归约子句来解决,但是由于循环是嵌套的,所以这个问题对我来说并不是那么简单。

最佳答案

这里不需要任何类型的 reduction 子句。然而,目前,所有线程都使用相同的指针并更新相同的内存位置(在分配给 pTime 的值中存在竞争条件,因此我怀疑是崩溃)。

所以你需要以私有(private)方式定义你的指针(通常通过在 parallel 区域内声明它,并为每个线程单独设置它为一个有意义的值。然后它可以递增你想要的。

修复后的代码如下所示(显然未经过测试):

void* function( const Input_st *Data, Output_st *Image ) {
#pragma omp parallel for schedule( static ) num_threads( 24 )
for ( int i = 0; i < Data->NX; i++ ) {
double *pTime = Image->pTime + i * Data->NR * Data->NZ;
for ( int j = 0; j < Data->NZ; j++ ) {
for ( int r = 0; r < Data->NR; r++ ) {
*pTime = function2();
pTime++;
}
}
}
return NULL;
}

关于c++ - 在嵌套循环中使用 OpenMP reduction 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53318150/

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