Alea GPU - Обработка неровных массивов
Я начал изучать Alea и пытался понять, как обращаться с многомерными массивами.
Мой подход заключается в передаче массива статической функции [GPUManaged], которая устанавливает параметры GPU и выполняет функцию ядра, возвращая результат.
Вопрос Является ли приведенный ниже код правильным подходом? Мне трудно понять, где мне нужно использовать шаг i+= (внутренний или внешний цикл или оба?). Как подход будет выглядеть для 3D или даже 4D Array?
Заранее спасибо! Ура, варочная панель.
Код
//Prepare & run Kernel2D Method on GPU
[GpuManaged]
public static double Compute_KernelGPU2D(double[][] Arr2D)
{
var gpu = Gpu.Default;
var lp = new LaunchParam(32, 512);
var source = Arr2D;
double[] result = new double[Arr2D.Length];
gpu.Launch(Kernel2D, lp, result, source);
return result.Sum(); //could be gpu.Sum(result);
}
//Kernel 2D Function
private static void Kernel2D(double[] result, double[][] source)
{
var start = blockIdx.x * blockDim.x + threadIdx.x;
var stride = gridDim.x * blockDim.x;
for (int i = 0; i < source.Length; i++)
{
for (var j = start; j < source[i].Length; j += stride)
result[i] += source[i][j] * source.Length;
}
//for (var i = start; i < source.Length; i+=stride)
//{
// for (int j = 0; j < source[i].Length; j++)
// result[i] += source[i][j] * source.Length;
//}
}