如何正确创建二维数组指针?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
相关产品推荐
相关产品推荐

