cudaMemset() - он устанавливает байты или целые числа?

Из онлайн- документации:

cudaError_t cudaMemset (void * devPtr, int value, size_t count )

Заполняет первые счетные байты области памяти, на которую указывает devPtr, постоянным значением байта.

Параметры: devPtr - Указатель на значение памяти устройства - Значение, устанавливаемое для каждого байта указанного количества памяти - Размер в байтах, чтобы установить

Это описание не является правильным, так как:

int *dJunk;
cudaMalloc((void**)&dJunk, 32*(sizeof(int));
cudaMemset(dJunk, 0x12, 32);

установит все 32 целых числа в 0x12, а не 0x12121212. (Ints против Byte)

Описание говорит об установке байтов. Количество и значение описываются в байтах. Счетчик уведомлений имеет тип size_t, а значение имеет тип int. т.е. установить размер байта в int-значение.

cudaMemset () не упоминается в руководстве по прогам. Я должен предположить, что поведение, которое я вижу, правильное, а документация плохая.

Есть ли лучший источник документации там? (Куда?)
Поддерживаются ли другие типы? то есть float *dJunk; Работа? Другие?

1 ответ

Решение

Документация верна, и ваша интерпретация того, что 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, Точно так же, как описано в документации.

Другие вопросы по тегам