Как написать глобальную функцию CUDA для этого? - PullRequest
1 голос
/ 18 февраля 2011

Я хочу преобразовать следующую функцию в CUDA.

void fun()
{
    for(i = 0; i < terrainGridLength; i++)
    {
       for(j = 0; j < terrainGridWidth; j++) 
       {
             //CODE of function
       }
    }
}

Я написал такую ​​функцию:

__global__ void fun()
{
    int i = blockIdx.x * blockDim.x + threadIdx.x;
    int j = blockIdx.y * blockDim.y + threadIdx.y;

    if((i < terrainGridLength)&&(j<terrainGridWidth))
    {
           //CODE of function
    }
}

Я объявил как terrainGridLength, так и terrainGridWidth как константы, и присвоил обеим значениям 120. И я вызываю функцию, как

весело <<< 30500 >>> ()

Но я не получаю правильный вывод.

Является ли код, который я написал, правильным? Я не очень хорошо разбирался в выполнении кода parellel. Пожалуйста, объясните мне, как будет работать код, и исправьте меня, если я допустил какие-либо ошибки.

1 Ответ

5 голосов
/ 19 февраля 2011

Вы используете измерение y, что означает, что вы используете потоки 2D-массива, поэтому вы не можете вызывать ядро ​​только с:

int numBlock = 30;
int numThreadsPerBlock = 500;
fun<<<numBlock,numThreadsPerBlock>>>()

Вызов должен быть: (Обратите внимание, что теперь у блоков есть 2D-потоки)

dim3 dimGrid(GRID_SIZE, GRID_SIZE); // 2D Grids with size = GRID_SIZE*GRID_SIZE
dim3 dimBlocks(BLOCK_SIZE, BLOCK_SIZE); //2D Blocks with size = BLOCK_SIZE*BLOCK_SIZE  
fun<<<dimGrid, dimBlocks>>>()

См. Руководство по программированию CUDA для получения дополнительной информации, а также, если вы хотите создать 2D-массив или 3D, лучше использовать cudaMalloc3D или cudaMallocPitch

Что касается вашего кода, Я думаю, что это сработает (но я не пробовал, хотя, надеюсь, вы можете ухватить идею с этим):

//main
dim3 dimGrid(1, 1); // 2D Grids with size = 1
dim3 dimBlocks(Width, Height); //2D Blocks with size = Height*Width 
fun<<<dimGrid, dimBlocks>>>(Width, Height)

//kernel
__global__ void fun(int Width, int Height)
{
    int i = blockIdx.x * blockDim.x + threadIdx.x;
    int j = blockIdx.y * blockDim.y + threadIdx.y;

    if((i < Width)&&(j<Height))
    {
           //CODE of function
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...