调用cudaMemcpyBatchAsync执行主机到设备批量拷贝时持续触发"invalid argument"错误的排查求助
调用cudaMemcpyBatchAsync执行主机到设备批量拷贝时持续触发"invalid argument"错误的排查求助
我仔细看了你的代码和问题描述,这个invalid argument错误大概率是因为**attrsIdxs数组的长度不符合API要求**,另外还有几个细节需要注意,我给你逐一分析:
核心问题:attrsIdxs数组长度不匹配
你当前的attrsIdxs只初始化了一个元素{0},但cudaMemcpyBatchAsync的API明确要求:attrsIdxs数组的长度必须等于numCopies(也就是你定义的NUM_COPIES=1000)——每个批量拷贝操作都需要指定对应的属性索引。哪怕所有拷贝都复用同一个属性配置,你也需要创建一个包含1000个0的数组,而不是只传单个元素。
修正这个问题的代码很简单,把attrsIdxs的初始化改成:
std::vector<size_t> attrsIdxs(NUM_COPIES, 0);
这应该是触发invalid argument错误的直接原因。
其他需要验证的细节
如果修正后仍然有问题,可以逐一排查以下点:
- 简化属性配置:对于常规的Host-to-Device拷贝,其实不需要手动设置
srcLocHint和dstLocHint,CUDA运行时会自动推断内存位置。你可以先尝试去掉属性相关参数,直接传nullptr给attrs、attrsIdxs,numAttrs设为0,验证基础批量拷贝是否能正常运行,再逐步添加自定义属性。 - 验证主机内存属性:虽然
cudaMallocHost默认分配可分页锁定内存,但某些环境下可能存在异常。可以通过cudaHostGetFlags函数验证分配的主机内存是否符合预期:unsigned int flags; CUDA_CHECK(cudaHostGetFlags(&flags, ptr_h)); std::cout << "Host memory flags: " << flags << std::endl; - 确认CUDA版本兼容性:虽然你提到驱动和编译用的CUDA版本都是12.9,但可以在代码中添加
cudaRuntimeGetVersion()打印实际运行时版本,确保编译版本和运行时版本完全匹配:int runtime_version; CUDA_CHECK(cudaRuntimeGetVersion(&runtime_version)); std::cout << "CUDA Runtime Version: " << runtime_version << std::endl;
你先优先修正attrsIdxs的长度问题,应该就能解决这个错误。如果还有异常,再逐步排查上述细节。
内容来源于stack exchange
相关产品推荐
相关产品推荐

