c++ - 使用带有嵌套循环的 OpenMP 缩减子句
问题描述
我有一个函数的当前版本:
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)
。
- 首先,这里的目的是加快功能,我想知道这种变化是否会显着加快?(比如使用较少的高速缓存?)
- 其次,我试图对其进行基准测试,但没有这样做!我认为这里的问题可以通过使用归约子句来解决,但是由于循环是嵌套的,所以问题对我来说并不是那么简单。
解决方案
这里不需要任何形式的reduction
子句。但是,目前,所有线程都使用相同的指针并更新相同的内存位置(在分配给 的值中存在竞争条件pTime
,因此我怀疑会发生崩溃)。
因此,您需要以私有方式定义指针(通常通过在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;
}
推荐阅读
- azure - 通过 PowerShell 获取 Azure 中资源的资源创建者
- javascript - 不使用 Safari 浏览器加载 CSS
- java - 带有枚举的通用输入参数编译错误
- python - ModuleNotFoundError:没有名为“cStringIO”的模块·
- javascript - 如何在 Html 的服务器端分页期间保存检查列表值?
- flutter - Flutter 构造函数参数
- wso2 - 如何将第一页从发布者更改为存储并将非 https 地址重定向到 https
- matplotlib - Matplotlib Pylot - 图像以低分辨率显示(像素到像素)
- python - 如何构建一个在轮询时不重复完全相同消息的 Python 日志记录函数
- magento-1.9 - magento 1.x 中的拆分数组