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

cudaMemset()-它设置字节还是整数?,cuda,semantics,memset,Cuda,Semantics,Memset,从文件: cudaError_t cudaMemset (void * devPtr, int value, size_t count ) 用常量字节值填充devPtr指向的内存区域的第一个计数字节 参数: devPtr-指向设备内存的指针 value-为指定内存的每个字节设置的值 计数-要设置的大小(以字节为单位) 此描述似乎不正确,因为: int *dJunk; cudaMalloc((void**)&dJunk, 32*(sizeof(int)); cudaMemset(dJun

从文件:

cudaError_t cudaMemset (void * devPtr, int value, size_t count )
用常量字节值填充devPtr指向的内存区域的第一个计数字节

参数: devPtr-指向设备内存的指针 value-为指定内存的每个字节设置的值 计数-要设置的大小(以字节为单位)

此描述似乎不正确,因为:

int *dJunk;
cudaMalloc((void**)&dJunk, 32*(sizeof(int));
cudaMemset(dJunk, 0x12, 32);
将所有32个整数设置为0x12,而不是0x12121212。(整数vs字节)

说明中介绍了如何设置字节。计数和值以字节为单位进行描述。请注意,计数类型为大小\u t,值类型为int。即,将字节大小设置为int值

《编程指南》中未提及cudaMemset()。 我必须假设我看到的行为是正确的,并且文档是不好的

有更好的文档来源吗?(在哪里?)

是否支持其他类型?i、 e.将
float*dJunk工作?其他人?

文档是正确的,您对
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;
}

即,所有128字节设置为0,然后前32个字节设置为
0x12
。与文档中描述的完全一样。

是的,我没有正确地查看结果。尝试更改cudaMemset(dJunk,0x12,32);到cudaMemset(dJunk,0x1234,32);cudaError\u t cudaMemset(void*devPtr,int值,size\u t count)应该是:cudaError\u t cudaMemset(void*devPtr,char值,size\u t count),即值的大小为字节。使用size int有点误导人(只是指出这点。)@Doug:我还是不确定你的观点是什么。您在问题中引用的文档清楚地表明,
value
被视为字节值。该函数的行为与标准C memset相同,唯一的区别是字节值在32位字的LSB中传递。顺便说一句,如果您真正想要的是驱动程序API中有一个真正的32位memset函数。如果数据类型是
float
,而不是
int
,则此方法不起作用。在这种情况下,
Junk
始终是零数组。如何使其适用于浮点值?
$ 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