cudaMemset似乎没有设置所需的值

时间:2013-07-07 18:56:53

标签: 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;
 }

我预计结果会是[10 11 12 13 14]而不是我得到垃圾值。

我错过了什么?

谢谢!

1 个答案:

答案 0 :(得分:9)

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

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

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

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

小数

168430090

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

[168430090 168430091 168430092 168430093 168430094]