cudaMemset似乎没有设置所需的值

Hai*_*fle 2 cuda

我有以下简单的程序来测试 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]我得到垃圾值.

我错过了什么?

谢谢!

sga*_*zvi 9

cudaMemset的工作方式与标准的memset函数类似,只是它用于设备内存.它设置指定内存位置的每个字节的值.您正在尝试将整数值设置为整数,这是memset无法实现的.

在提供的示例中,cudaMemset将每个字节的值设置为10.这意味着内存将像这样初始化

0A0A0A0A0A0A0A...... (用十六进制表示法).

所以当你把它读成一个32位整数时,你会得到:

168430090 十进制

这些值不是垃圾,这些是预期的结果.

[168430090 168430091 168430092 168430093 168430094]

  • 另请参见[memset integer array?](http://stackoverflow.com/questions/7202411/memset-integer-array)和[cudaMemset()用法](http://stackoverflow.com/questions/13387101/cudamemset-usage ). (3认同)
  • 写一个可以初始化数组的内核:) (2认同)