Вложенный для цикла в трех пространственных измерениях — OMP

Я занимаюсь разработкой на C / C ++, gcc 4.8.4, без C ++ 11 атм. Я использую OMP Pragmata. Часто мы перебираем 3D-массив:

#pragma omp parallel for
for(size_t i = startI ; i < stopI ; i++) {
for(size_t j = startJ ; j < stopJ ; j++) {
for(size_t k = startK ; k < stopK ; k++) {
//example calculations
valueIJK = func1(i,j,k);
newArray[i][j][k] = func2(oldArray[i][j][k]) * valueIJK;
}
}
}

Моя первая мысль:

#pragma omp parallel for
for(size_t i[0] = start[0] ; i[0] < stop[0] ; i[0]++) {
for(size_t i[1] = start[1] ; i[1] < stop[1] ; i[1]++) {
for(size_t i[2] = start[2] ; i[2] < stop[2] ; i[2]++) {
//example calculations
//valueIJK = func1(i,j,k);
//newArray[i][j][k] = func2(oldArray[i][j][k]) * valueIJK;
}
}
}

Но я думаю, лучшим будет что-то вроде:

double i[3];
double start[3];
double stop[3];
/* set start, stop values */
/* next line is highly incorrect code */
#pragma omp parallel for
vectorized_for(i = start ; i < stop ; i++)
//example calculations
//valueIJK = func1(i,j,k);
//newArray[i][j][k] = func2(oldArray[i][j][k]) * valueIJK;
}

Мои вопросы сейчас:

  1. Ты понимаешь, чего я хочу? D Я могу объяснить больше
  2. Можно ли это реализовать? Сокрытие трех гнезд для петель? Что-то вроде «для каждой комбинации (i, j, k) делать следующие вещи»? Как for_each в?
  3. Это все еще будет признано omp?
  4. Это так быстро, как раньше?

Большое спасибо за ваши мысли 🙂

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]