cudaMemset () - устанавливает байты или целые числа?
С онлайн документы:
cudaError_t cudaMemset (void * devPtr, int value, size_t count )
заполняет первые байты подсчета области памяти, на которую указывает devPtr, константой байт значение value.
параметры: devPtr - указатель на память устройства value-значение для каждого байт из указанной памяти count-Size in байт установить
это описание не кажется правильным as:
int *dJunk;
cudaMalloc((void**)&dJunk, 32*(sizeof(int));
cudaMemset(dJunk, 0x12, 32);
установит все 32 целых числа в 0x12, а не 0x12121212. (Int vs Byte)
в описании говорится о настройке байтов. Count и Value описываются в терминах байтов. Количество уведомлений имеет тип реализация, а значение имеет тип int. т. е. установите размер байта в значение int.
cudaMemset () не упоминается в руководстве prog. Я должен предположить, что поведение, которое я вижу, правильное, и документация плохая.
есть лучший источник документации? (Куда?)
Поддерживаются ли другие типы? т. е. float *dJunk;
работы? Другие?
1 ответов
документация правильная, и ваша интерпретация того, что cudaMemset
совсем не так. Функция действительно устанавливает значения байтов. Ваш пример устанавливает первые 32 байт to 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
ie. все 128 байт установлены в 0, затем первые 32 байта установлены в 0x12
. Точно так, как описано в документации.