CUDA 10.0 中 cuLaunchKernel 的最后一个参数:使用指针数组传递 Kernel 函数参数
cuLaunchKernel 的最后一个参数是一个指向 kernel 函数参数列表的指针,需要将 kernel 函数的参数列表打包成一个数组,然后将该数组的地址传递给 cuLaunchKernel 函数。具体步骤如下:
-
定义一个数组,将需要传递给 kernel 函数的参数按照顺序打包,保证参数类型和数量与 kernel 函数定义的一致。
-
获取数组的地址,可以使用数组名或者 &数组名[0] 的方式。
-
将数组地址作为最后一个参数传递给 cuLaunchKernel 函数。
下面是一个示例代码:
__global__ void myKernel(int* a, int* b, int* c) {
int i = threadIdx.x;
c[i] = a[i] + b[i];
}
int main() {
int a[10], b[10], c[10];
int* d_a, *d_b, *d_c;
cudaMalloc((void**)&d_a, sizeof(int) * 10);
cudaMalloc((void**)&d_b, sizeof(int) * 10);
cudaMalloc((void**)&d_c, sizeof(int) * 10);
cudaMemcpy(d_a, a, sizeof(int) * 10, cudaMemcpyHostToDevice);
cudaMemcpy(d_b, b, sizeof(int) * 10, cudaMemcpyHostToDevice);
dim3 gridSize(1, 1, 1);
dim3 blockSize(10, 1, 1);
void* args[] = { &d_a, &d_b, &d_c };
size_t size = sizeof(args) / sizeof(args[0]);
cuLaunchKernel(myKernel, gridSize.x, gridSize.y, gridSize.z, blockSize.x, blockSize.y, blockSize.z, 0, NULL, args, NULL);
cudaMemcpy(c, d_c, sizeof(int) * 10, cudaMemcpyDeviceToHost);
cudaFree(d_a);
cudaFree(d_b);
cudaFree(d_c);
return 0;
}
在上面的示例代码中,我们定义了一个包含 3 个指针参数的数组 args,并将该数组的地址作为最后一个参数传递给 cuLaunchKernel 函数。在 kernel 函数 myKernel 中,我们使用了这 3 个指针参数来计算 c 数组的值。
原文地址: https://www.cveoy.top/t/topic/nycO 著作权归作者所有。请勿转载和采集!