我有以下简单的程序来测试 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;
}
Run Code Online (Sandbox Code Playgroud)
我预计结果将是[10 11 12 13 14]我得到垃圾值.
我错过了什么?
谢谢!
cudaMemset的工作方式与标准的memset函数类似,只是它用于设备内存.它设置指定内存位置的每个字节的值.您正在尝试将整数值设置为整数,这是memset无法实现的.
在提供的示例中,cudaMemset将每个字节的值设置为10.这意味着内存将像这样初始化
0A0A0A0A0A0A0A...... (用十六进制表示法).
所以当你把它读成一个32位整数时,你会得到:
168430090 十进制
这些值不是垃圾,这些是预期的结果.
[168430090 168430091 168430092 168430093 168430094]