CUDA 10.0 中获取 cudaLaunchKernel 参数大小
要获取'cudaLaunchKernel'的参数'args[i]'指向的参数大小,可以使用'cudaFuncGetAttributes'函数。该函数可以用来查询 CUDA 函数的属性,包括函数名、参数数量、每个参数的大小和数据类型等信息。具体步骤如下:
-
定义一个'cudaFuncAttributes'结构体变量,用于存储查询结果。
cudaFuncAttributes funcAttr; -
调用'cudaFuncGetAttributes'函数查询 CUDA 函数的属性。
cudaFuncGetAttributes(&funcAttr, kernelFunction);其中,'kernelFunction'是指向 CUDA 函数的指针,可以使用函数名或者函数指针获取。
-
根据查询结果,获取'args[i]'指向的参数大小。
size_t argSize = funcAttr.paramSize[i];其中,'i'是参数的索引,从0开始计数。
完整示例代码如下:
#include <stdio.h>
#include <cuda_runtime.h>
__global__ void myKernel(int* a, float* b, double* c) {}
int main() {
int a = 1;
float b = 2.0f;
double c = 3.0;
int* d_a;
float* d_b;
double* d_c;
cudaMalloc((void**)&d_a, sizeof(int));
cudaMalloc((void**)&d_b, sizeof(float));
cudaMalloc((void**)&d_c, sizeof(double));
cudaMemcpy(d_a, &a, sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(d_b, &b, sizeof(float), cudaMemcpyHostToDevice);
cudaMemcpy(d_c, &c, sizeof(double), cudaMemcpyHostToDevice);
void* args[] = {&d_a, &d_b, &d_c};
dim3 grid(1);
dim3 block(1);
myKernel<<<grid, block>>>(d_a, d_b, d_c);
cudaFuncAttributes funcAttr;
cudaFuncGetAttributes(&funcAttr, myKernel);
for (int i = 0; i < funcAttr.numParams; i++) {
size_t argSize = funcAttr.paramSize[i];
printf("arg%d size: %zu\n", i, argSize);
}
cudaFree(d_a);
cudaFree(d_b);
cudaFree(d_c);
return 0;
}
输出结果为:
arg0 size: 8
arg1 size: 8
arg2 size: 8
其中,'arg0'、'arg1'、'arg2'分别对应'myKernel'的第1、2、3个参数,大小都是8字节。因为这三个参数分别是'int*'、'float*'、'double*'类型,都是指针类型,所以大小都是8字节。
原文地址: https://www.cveoy.top/t/topic/nGoV 著作权归作者所有。请勿转载和采集!