嵌套循环Cuda C

时间:2015-07-19 20:19:32

标签: c cuda nested

我有一个1d的int数组,我想并行化2 for循环。

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

这是转换&#34;的正确方法吗?它到库达?

__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 */
    }
} 

而且,我应该如何从main调用kernel foo?

1 个答案:

答案 0 :(得分:3)

是的,这是让每个线程执行该循环迭代的正确方法。

要调用内核foo,您需要指定 Grid Block 维度并分配/初始化设备的内存。它看起来像这样。

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