调用cudaMemset设置float数组为何结果全为0?
为什么cudaMemset设置float数组后值显示为0?
问题根源
cudaMemset和标准C库的memset工作逻辑完全一致:按单个字节为单位赋值,而非按数组元素的类型(这里是float)赋值。
你传入的第二个参数1会被转换为unsigned char类型,将目标内存的每一个字节都设置为0x01。一个float类型占4字节,因此每个float元素的二进制表示为0x01010101,转换成十进制浮点数是1.0842021724855044e-44——这个数值极小,用%f格式化输出时会被显示为0.000000,这就是你看到结果的原因。
解决方案
方案1:主机端直接循环赋值(适合小容量数组)
如果要给float数组设置特定浮点值(比如1.0f),直接在主机端遍历数组赋值即可:
int main(){ float *elementsC; // 主机端分配页锁定内存 cudaMallocHost(&elementsC, 4*sizeof(float)); // 逐个设置float元素为1.0 for(int i = 0; i < 4; i++){ elementsC[i] = 1.0f; } printf("Check the first ele of C: %f\n", elementsC[0]); }
方案2:用CUDA核函数初始化(适合大容量数组)
如果数组容量较大,更高效的方式是启动CUDA核函数来并行初始化:
__global__ void initFloatArray(float *arr, float val, int size){ int idx = blockIdx.x * blockDim.x + threadIdx.x; if(idx < size){ arr[idx] = val; } } int main(){ float *elementsC; cudaMallocHost(&elementsC, 4*sizeof(float)); // 启动核函数,单线程块处理4个元素 initFloatArray<<<1, 4>>>(elementsC, 1.0f, 4); cudaDeviceSynchronize(); // 等待核函数执行完成 printf("Check the first ele of C: %f\n", elementsC[0]); }
注意事项
cudaMemset仅适合初始化单字节对齐的整数类型数组(比如char、unsigned char,或是设置int数组为0这类字节全为0的场景),对于float、double、结构体等多字节复杂类型,无法直接用它来设置元素的预期值。
内容的提问来源于stack exchange,提问作者Maxi mini
相关产品推荐
相关产品推荐

