[CUDA]关于Drive API中Kernel函数参数的一个坑

本文揭示了CUDA Drive API中launch kernel函数使用时的一个潜在问题,涉及参数传递的方式。当通过std::vector<void*>存储并传递参数时,由于可能触发的内存重新分配,导致参数地址变化。提出两种解决方案:一次性存储所有参数或预先分配vector空间。测试环境为ubuntu 16.04和CUDA 9.0。
摘要由CSDN通过智能技术生成

CUDADrive APIlaunch kernel 函数原型如下:

CUresult CUDAAPI cuLaunchKernel(CUfunction f,
                                unsigned int gridDimX,
                                unsigned int gridDimY,
                                unsigned int gridDimZ,
                                unsigned int blockDimX,
                                unsigned int blockDimY,
                                unsigned int blockDimZ,
                                unsigned int sharedMemBytes,
                                CUstream hStream,
                                void **kernelParams,
                                void **extra);
在该函数中 , 参数 kernelParams 是个指针的指针。

举例说明:

如果我们的kernel函数原型如下:

void ktest(void *p1, void*p2, void* p3, void*p4, void*p5, void*p6);
假设我们现在有 6 void* 的指针变量,
void *p1,*p2,*p3,*p4,*p5,*p6;
那么  kernelParams 的值不能是这个样子:
void* kernelParams[]= {p1,p2,p3,p4,p5,p6}

而必须是这个样子

void*kernelParams[]= {(void*)&p1,(void*)&p2,(void*)&p3,
                
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值