如何从主机代码高效初始化CUDA整数数组所有元素为-1?
如何高效将CUDA设备端整数数组初始化为-1
最优方案:活用cudaMemset
你以为cudaMemset不能用?其实刚好适配!因为整数-1的二进制表示是所有位全1(比如32位int就是4个0xFF字节),直接用cudaMemset把每个字节设为0xFF,每个int元素就自动变成-1了。这是性能最高的方式,因为cudaMemset是硬件加速的原生操作:
// count为数组元素总个数 cudaMemset(ptr, 0xFF, count * sizeof(int));
备选方案:自定义初始化核函数
如果后续需要扩展初始化逻辑(比如根据索引设置不同值),可以写一个轻量核函数:
__global__ void initInts(int* arr, int val, int count) { const int idx = blockIdx.x * blockDim.x + threadIdx.x; if (idx < count) arr[idx] = val; } // 主机端调用示例 const int block_dim = 256; const int grid_dim = (count + block_dim - 1) / block_dim; initInts<<<grid_dim, block_dim>>>(ptr, -1, count); // 按需同步,比如需要立刻使用数组时 cudaDeviceSynchronize();
但注意,这个方法的性能比cudaMemset差,非必要不优先选择。
小数组场景:主机初始化后拷贝
如果数组规模很小,也可以在主机内存先初始化再拷贝到设备:
int* host_buf = (int*)malloc(count * sizeof(int)); memset(host_buf, 0xFF, count * sizeof(int)); cudaMemcpy(ptr, host_buf, count * sizeof(int), cudaMemcpyHostToDevice); free(host_buf);
但这种方法需要占用额外主机内存,大数组场景不推荐。
内容的提问来源于stack exchange,提问作者Ars ML
相关产品推荐
相关产品推荐

