Если я передаю массив с помощью pycuda в графический процессор, а затем печатаю его, почему он печатает нули? - PullRequest
0 голосов
/ 04 мая 2019

Я пытаюсь использовать pycuda для ускорения моей нейронной сети (я знаю, что тензорный поток проще использовать для ускорения GPU, я просто хотел сначала сделать это вручную, поскольку я относительно новичок в нейронных сетях), но всякий раз, когда я прохожу массив в графический процессор и каждый поток распечатывает значение массива в threadIdx, он печатает нули, хотя я устанавливаю значения массива.

Я попытался использовать чрезвычайно простое ядро ​​для тестирования, которое просто печатает значения одномерного массива, и я попытался изменить тип данных на float32.

Базовое ядро, которое я использую для тестирования этой проблемы:

test_mod = SourceModule("""
    __global__ void test(float *a)
    {
        printf("%d: %d\\n", threadIdx.x, a[threadIdx.x]);
    }

    """)

Код Python, который я использую для создания массива и инициализации ядра:

a = np.asarray([4,2,1])
a = a.astype(np.float32)
test_module = test_mod.get_function("test")
test_module(cuda.In(a), block=(3, 1, 1))

Я ожидаю, что он напечатает порядка 4, 2 и 1, но каждый поток печатает 0.

1 Ответ

1 голос
/ 08 мая 2019

Проблема заключается в выражении print в ядре. Спецификатор формата %d предназначен для целых чисел. Это не будет правильно форматировать значение с плавающей запятой. Чтобы это исправить, измените ядро ​​так:

test_mod = SourceModule("""
    __global__ void test(float *a)
    {
        printf("%d: %f\\n", threadIdx.x, a[threadIdx.x]);
    }

    """)

[Ответ собран из комментариев и добавлен в качестве записи вики сообщества, чтобы попытаться получить вопрос из очереди без ответа для тега CUDA].

...