Я хочу сравнить максимальную абсолютную разницу между двумя трехмерными массивами с C++ AMP.AMP C++ вычисляет максимальное значение по массиву
С OpenMP это просто. Учитывая 2 массивов
float*** u, ***uOld;
Код является:
double residual = 0;
#pragma omp parallel for schedule(static) collapse(3) reduction(max : residual)
for (int i = 0; i < nbX; i++)
for (int j = 0; j < nbY; j++)
for (int k = 0; k < nbTheta; k++)
residual = std::max(residual, fabs(u[i][j][k] - uOld[i][j][k]));
Было бы легко использовать max_element от AMP алгоритмов, но это не реализовано. Я думаю, что-то вроде этого, но сокращение требуется на уровне внешнего контура:
extent<1> extTheta(nbTheta);
parallel_for_each(extTheta, [=, &u_, &uOld_](index<1> iTheta) restrict(amp)
{
type residual = 0;
for (int iX = 0; iX < nbX; iX++)
for (int iY = 0; iY < nbY; iY++)
residual = fast_math::fmax(residual, fast_math::fabs(u_[iX][iY][iTheta] - uOld_[iX][iY][iTheta]));
})
Данные на GPU, и я не хочу его транзит на GPU по соображениям эффективности. Как это сделать эффективно?