要获取'cudaLaunchKernel'的参数'args[i]'指向的参数大小,可以使用'cudaFuncGetAttributes'函数。该函数可以用来查询 CUDA 函数的属性,包括函数名、参数数量、每个参数的大小和数据类型等信息。具体步骤如下:

  1. 定义一个'cudaFuncAttributes'结构体变量,用于存储查询结果。

    cudaFuncAttributes funcAttr;
    
  2. 调用'cudaFuncGetAttributes'函数查询 CUDA 函数的属性。

    cudaFuncGetAttributes(&funcAttr, kernelFunction);
    

    其中,'kernelFunction'是指向 CUDA 函数的指针,可以使用函数名或者函数指针获取。

  3. 根据查询结果,获取'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字节。

CUDA 10.0 中获取 cudaLaunchKernel 参数大小

原文地址: https://www.cveoy.top/t/topic/nGoV 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录