我有以下简单程序来测试cudaMemset
#include <iostream>
#include <cuda.h>
using namespace std;
__global__ void kernel(int *input){
input[threadIdx.x] += threadIdx.x;
}
int main() {
size_t size = 5;
int *h_ptr, *d_ptr;
h_ptr = new int[size];
cudaMalloc((void **)&d_ptr, sizeof(int) * size);
cudaMemset(d_ptr, 10, sizeof(int) * size);
kernel<<<1, size>>>(d_ptr);
cudaDeviceSynchronize();
cudaMemcpy(h_ptr, d_ptr, sizeof(int)*size, cudaMemcpyDeviceToHost);
for(int i = 0; i < size; i++)
cout<<h_ptr[i]<<" ";
cout<<endl;
return 0;
}
我预计结果会是[10 11 12 13 14]
而不是我得到垃圾值。
我错过了什么?
谢谢!
答案 0 :(得分:9)
cudaMemset的工作方式与标准memset函数类似,只是它用于设备内存。 它设置指定内存位置的每个字节的值。您正在尝试将整数值设置为整数,这是memset无法实现的。
在提供的示例中,cudaMemset将每个字节的值设置为10。 这意味着内存将像这样初始化
0A0A0A0A0A0A0A......
(以十六进制表示法)。
所以当你把它读成一个32位整数时,你会得到:
小数 168430090
这些值不是垃圾,这些是预期的结果。
[168430090 168430091 168430092 168430093 168430094]