我有一个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?
答案 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平台上学习更多知识。我强烈建议您阅读其中的一些内容 - 它可以帮助您开始使用。