2015-07-19 4 views
1

У меня есть 1d int-array, и я хочу распараллелить 2 для петель.Вложенная петля Cuda C

void foo(int *array, int width, int height) { 
    for (i = 0 ; i < height ; i++) { 
     for (j = 0 ; j < width ; j++) { 
      /* do smth */ 
     } 
    } 
} 

Это правильный способ «конвертировать» его в Cuda?

__global__ void foo(int *array, int width, int height) { 
    unsigned int i = blockIdx.y*blockDim.y + threadIdx.y; 
    unsigned int j = blockIdx.x*blockDim.x + threadIdx.x; 
    if (i < height && j < width) { 
     /* do smth */ 
    } 
} 

а также, как я могу назвать ядро ​​foo из main?

+3

Интернет переполнен свободной вводные и обучающей информацией о CUDA. На этот вопрос можно было легко ответить, прочитав некоторые из них. – talonmies

ответ

2

Да, это правильный способ, чтобы каждая нить выполняла итерацию этого цикла.

Чтобы вызвать ядро ​​foo, вы будете нуждаться, чтобы указать Сетка и Блок размеры и выделить/инициализации памяти устройства. Это будет выглядеть примерно так.

int main(){ 
    /* Width/Height initialization up to you */ 
    int width, height; 

    /* Device-Level Allocations, etc */ 
    int *h_arr, *d_arr; 
    size_t array_size = width * height * sizeof(int); 

    /* Allocate and Initialize Device-level memory */ 
    cudaMalloc((void **) &d_arr, array_size); 
    cudaMemcpy(d_arr, h_arr, array_size, cudaMemcpyHostToDevice); 

    /* Specify layout of Grid and Blocks */ 
    dim3 threads_per_block(width, height); 
    dim3 blocks_per_dimension(block_x_dim, block_y_dim); 

    /* Kernel Invocation */ 
    foo<<<blocks_per_dimension, threads_per_block>>>(d_arr, width, height); 
} 

На веб-сайте NVidia есть несколько полезных ресурсов для получения дополнительной информации о платформе CUDA. Я настоятельно рекомендую прочитать некоторые из них - это может помочь с началом работы.

Intro to CUDA C

Смежные вопросы