为何CUDA Driver API会拒绝2D数组拷贝的传入参数?
错误原因及修复方案
1. CUDA_MEMCPY2D 结构体未清零初始化
你只对CUDA_MEMCPY2D的部分字段做了显式赋值,没有先对整个结构体清零,栈上申请的结构体剩余未赋值字段(比如srcHost、dstPitch、dstDevice等)会是随机垃圾值,CUDA驱动校验参数时会识别到非法值,直接抛出invalid argument错误。
2. 显存申请大小单位错误
cuMemAllocManaged要求传入的分配大小单位是字节,你当前传入的arr_size是float元素的个数(3*3=9),仅申请了9字节内存,远小于存储9个float需要的36字节,后续std::iota写入数据已经发生越界,也会导致后续拷贝参数非法。
修复后的代码片段
- 修改显存申请逻辑:
// 原代码:status = cuMemAllocManaged(&dptr, arr_size, CU_MEM_ATTACH_GLOBAL); // 改为乘以sizeof(float),单位转换为字节 status = cuMemAllocManaged(&dptr, arr_size * sizeof(float), CU_MEM_ATTACH_GLOBAL);
- 初始化CUDA_MEMCPY2D结构体:
CUDA_MEMCPY2D cp; // 新增:先清空整个结构体所有字段为0 memset(&cp, 0, sizeof(cp)); { // Source cp.srcXInBytes = 0; cp.srcY = 0; // No offset cp.srcMemoryType = ptr_in_memory_type; cp.srcDevice = as_address(ptr_in); cp.srcPitch = dims.width * sizeof(float); // Destination cp.dstXInBytes = 0; cp.dstY = 0; // No destination offset cp.dstMemoryType = CU_MEMORYTYPE_ARRAY; cp.dstArray = arr_handle; cp.WidthInBytes = dims.width * sizeof(float); cp.Height = dims.height; }
修复后程序即可正常运行。
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

