【发布时间】:2018-11-15 11:09:46
【问题描述】:
我有一个函数的当前版本:
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)。
- 首先,这里的目的是加快功能,我想知道这种变化是否会显着加快? (比如使用较少的缓存内存?)
- 其次,我尝试对其进行基准测试,但没有成功!我认为这里的问题可以通过使用归约子句来解决,但是由于循环是嵌套的,所以问题对我来说并不是那么简单。
【问题讨论】:
标签: c++ performance openmp