2

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

我错过了什么?

谢谢!

4

1 回答 1

9

cudaMemset与标准memset函数一样工作,只是它用于设备内存。它设置指定内存位置的每个字节的值。您正在尝试将整数的值设置为一个整体,这在 memset 中是不可能的。

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

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

因此,当您将其读取为 32 位整数时,您将得到:

168430090十进制

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

[168430090 168430091 168430092 168430093 168430094]

于 2013-07-07T19:21:24.630 回答