Как преобразовать функцию с вложенными циклами for в Cudafy.Net

Я не могу поверить, что после всех исследований и чтения, которое я провел, я все еще не на 100% уверен в том, как это сделать, поэтому я должен спросить... Я пытаюсь заставить что-то вроде следующего работать на карте GPU и Я использую Cudafy.Net для создания эквивалента Cuda C. Я хочу, чтобы это работало как можно быстрее.

Если у меня есть функция (упрощенная), такая как:

Transform()
{
    for (lgDY = 0; lgDY < lgeHeight; lgDY++)
    {
        for (lgDX = 0; lgDX < lgeWidth; lgDX++)
        {
             // do a lot of stuff with lgDY and lgDX like stuff a matrix
        }
     }
}

Я вызываю это с помощью функции Launch() следующим образом:

gpu.Launch(blocksize, threadsize, "Transform", args...)

Я знаком с GThread, переданным в качестве первого аргумента, и blocksize.x, blockdim.x и threadsize.x, а также с y и z для блока. Мне трудно понять, пропадают ли утверждения for, и я заменяю их тестом вроде

if ( y < lgeHeight )
    if ( x < lgeWidth )
...

Но тогда понятия не имею, как "связать каждую итерацию с увеличенными lgDY и lgDX.

Я прошу прощения, если это что-то явно очевидно, или если я не описал, что я пытаюсь сделать точно. Просто запутался, как сделать правильный вложенный цикл. Я ценю любую помощь, чтобы заставить меня двигаться в правильном направлении.

1 ответ

Решение

Это зависит от размера lgeHeight и lgeWidth. Если их произведение меньше потоков на карте, то при запуске ядра вы можете предположить, что каждый поток будет работать на одной паре x и y.

lgDY = threadIdx.x
lgDX = blockIdx.x

Тогда вы можете вычислить их все сразу. Если у вас больше потоков, чем продукта, вам нужно будет разделить задачу на более мелкие части или выполнить небольшую итерацию для каждой матрицы.

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