来自online文档:
cudaError_t cudaMemset (void * devPtr, int value, size_t count )
使用常量 byte 值填充devPtr指向的内存区域的第一个计数字节。
参数: devPtr - 指向设备内存的指针 value - 为指定内存的每个字节设置的值 count - 要设置字节的大小
此描述似乎不正确:
int *dJunk;
cudaMalloc((void**)&dJunk, 32*(sizeof(int));
cudaMemset(dJunk, 0x12, 32);
将所有32个整数设置为0x12,而不是0x12121212。 (Int vs Byte)
描述讨论了设置字节。计数和值以字节为单位进行描述。通知计数的类型为 size_t ,值的类型为int。即将字节大小设置为int值。
编程指南中未提及cudaMemset()。 我必须假设我看到的行为是正确的,并且文档很糟糕。
那里有更好的文档来源吗? (在哪儿?)
是否支持其他类型?即float *dJunk;
会工作吗?其他
答案 0 :(得分:14)
文档是正确的,您对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;
}
产生
$ 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
即。将所有128个字节设置为0,然后将前32个字节设置为0x12
。完全如文档所述。