У меня есть текущая версия функции:
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)
.
- Во-первых, цель здесь состоит в том, чтобы ускорить работу функции, и мне интересно, значительно ли ускорится такое изменение? (Вроде меньше кеш памяти используется?)
- Во-вторых, что ж, я попытался сравнить его, но не смог! Я думаю, что проблему здесь можно решить с помощью предложения сокращения, но поскольку циклы вложены, проблема не так проста для меня.