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;
        //}
    }

0 ответов

Другие вопросы по тегам