You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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写入数据已经发生越界,也会导致后续拷贝参数非法。


修复后的代码片段

  1. 修改显存申请逻辑:
// 原代码:status = cuMemAllocManaged(&dptr, arr_size, CU_MEM_ATTACH_GLOBAL);
// 改为乘以sizeof(float),单位转换为字节
status = cuMemAllocManaged(&dptr, arr_size * sizeof(float), CU_MEM_ATTACH_GLOBAL);
  1. 初始化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 23:15:04