Я выполняю некоторые манипуляции/вычисления массивов в CUDA (через Cudafy.NET library, хотя меня одинаково интересуют методы CUDA/C++), и вам нужно вычислить минимальные и максимальные значения, которые находятся в массиве. Одно из ядер выглядит следующим образом:Возвращение минимального и максимального элементов массива в CUDA
[Cudafy]
public static void UpdateEz(GThread thread, float time, float ca, float cb, float[,] hx, float[,] hy, float[,] ez)
{
var i = thread.blockIdx.x;
var j = thread.blockIdx.y;
if (i > 0 && i < ez.GetLength(0) - 1 && j > 0 && j < ez.GetLength(1) - 1)
ez[i, j] =
ca * ez[i, j]
+ cb * (hx[i, j] - hx[i - 1, j])
+ cb * (hy[i, j - 1] - hy[i, j])
;
}
Я хотел бы сделать что-то вроде этого:
[Cudafy]
public static void UpdateEz(GThread thread, float time, float ca, float cb, float[,] hx, float[,] hy, float[,] ez, out float min, out float max)
{
var i = thread.blockIdx.x;
var j = thread.blockIdx.y;
min = float.MaxValue;
max = float.MinValue;
if (i > 0 && i < ez.GetLength(0) - 1 && j > 0 && j < ez.GetLength(1) - 1)
{
ez[i, j] =
ca * ez[i, j]
+ cb * (hx[i, j] - hx[i - 1, j])
+ cb * (hy[i, j - 1] - hy[i, j])
;
min = Math.Min(ez[i, j], min);
max = Math.Max(ez[i, j], max);
}
}
кто знает удобный способ вернуть минимальное и максимальное значения (для всего массива , а не только на поток или блок)?
Минимальные и максимальные значения традиционно обнаруживаются с помощью операции уменьшения. Я не слишком хорошо знаком с Cudafy, но на самом деле это не похоже на сокращение. – alrikai
@alrikai Я буду счастливо убивать и убирать мой код, чтобы решить эту проблему. Я просмотрел карту/уменьшить и т. Д., Но реализация немного неясна. Забудьте часть cudafy: как бы вы сделали это в прямом CUDA/C++? –
вы можете использовать 'thrust' или' npp'. – sgarizvi