cudaMemset() - 它是设置字节还是整数?

Dou*_*oug 8 cuda memset semantics

来自在线文档:

cudaError_t cudaMemset (void * devPtr, int value, size_t count )
Run Code Online (Sandbox Code Playgroud)

使用常量字节值填充devPtr指向的内存区域的第一个计数字节.

参数:devPtr -指向设备存储器值-值设置每个字节指定的存储器计数-大小在字节设置

此描述似乎不正确:

int *dJunk;
cudaMalloc((void**)&dJunk, 32*(sizeof(int));
cudaMemset(dJunk, 0x12, 32);
Run Code Online (Sandbox Code Playgroud)

将所有32个整数设置为0x12,而不是0x12121212.(Int vs Byte)

描述讨论了设置字节.计数和值以字节为单位进行描述.通知计数的类型为size_t,值的类型为int.即将字节大小设置为int值.

编程指南中未提及cudaMemset().我必须假设我看到的行为是正确的,文档很糟糕.

那里有更好的文档来源吗?(在哪里?)
是否支持其他类型?即会float *dJunk;工作吗?其他?

tal*_*ies 16

文档是正确的,你对cudaMemset错误的解释是什么.该函数确实设置了字节值.您的示例将前32 个字节设置0x12,而不是将所有32个整数设置为0x12,即:

#include <cstdio>

int main(void)
{
    const int n = 32;
    const size_t sz = size_t(n) * sizeof(int);
    int *dJunk;
    cudaMalloc((void**)&dJunk, sz);
    cudaMemset(dJunk, 0, sz);
    cudaMemset(dJunk, 0x12, 32);

    int *Junk = new int[n];

    cudaMemcpy(Junk, dJunk, sz, cudaMemcpyDeviceToHost);

    for(int i=0; i<n; i++) {
        fprintf(stdout, "%d %x\n", i, Junk[i]);
    }

    cudaDeviceReset();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

产生

$ nvcc memset.cu 
$ ./a.out 

0 12121212
1 12121212
2 12121212
3 12121212
4 12121212
5 12121212
6 12121212
7 12121212
8 0
9 0
10 0
11 0
12 0
13 0
14 0
15 0
16 0
17 0
18 0
19 0
20 0
21 0
22 0
23 0
24 0
25 0
26 0
27 0
28 0
29 0
30 0
31 0
Run Code Online (Sandbox Code Playgroud)

即.将所有128个字节设置为0,然后将前32个字节设置为0x12.完全如文档所述.