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

如何正确创建二维数组指针?CUDA内存分配后元素填充异常排查

问题分析与解决

你的核心问题出在CUDA内存分配的大小计算错误,导致设备端内存空间不足,后续写入操作越界,出现元素为空的异常。

错误原因

你声明的d_result是指向int[16]类型的指针,意味着每个数组元素是包含16个int的数组。而你调用cudaMalloc时,只分配了matrix_rows * matrix_cols * sizeof(int)的空间——这仅够存放256个int,但实际需要存放256组、每组16个int,总空间应该是256 * 16 * sizeof(int)。内存不足会导致核函数中索引超过13(实际是内存能容纳的组数)后,无法正常写入数据。

修正代码

把内存分配的代码修改为:

// 正确计算内存大小:组数 × 每组int的数量 × int字节数,或直接用sizeof(int[16])获取每组的大小
CHECK_CUDA_ERROR(cudaMalloc((void**)&d_result, matrix_rows * matrix_cols * sizeof(int[16])));

或者等价写法:

CHECK_CUDA_ERROR(cudaMalloc((void**)&d_result, matrix_rows * matrix_cols * 16 * sizeof(int)));

额外注意事项

如果需要将主机端的h_result拷贝到设备端,也要使用正确的内存大小:

CHECK_CUDA_ERROR(cudaMemcpy(d_result, h_result, matrix_rows * matrix_cols * sizeof(int[16]), cudaMemcpyHostToDevice));

核函数中对d_result[i][j]的索引逻辑(i范围0255,j范围015)是正确的,修正内存分配后即可正常写入所有元素。

内容的提问来源于stack exchange,提问作者imNotARobot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 23:58:12