Как преобразовать функцию с вложенными циклами 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
Тогда вы можете вычислить их все сразу. Если у вас больше потоков, чем продукта, вам нужно будет разделить задачу на более мелкие части или выполнить небольшую итерацию для каждой матрицы.