2012-09-08 2 views
3

Как работает CUDA cudaMemset() функция? Я наблюдал значительное экономию времени, если инициализация памяти реализована путем запуска количества потоков = количество элементов. Почему такая экономия достигается?Как реализована cudaMemset?

+0

Взгляните на эту презентацию: http://mc.stanford.edu/cgi-bin/images/b/ba/M02_2.pdf – paulsm4

ответ

2

cudaMemset вызывает cuMemsetD8 или cuMemsetD8Aysnc. Это легко определить в инструментах. Реализация драйвера будет пытаться оптимизировать выполнение на основе выравнивания адреса назначения, размера значения для записи и количества байтов для записи. Это легко определить, написав несколько эталонных тестов. Реализация CUDA должна обрабатывать все случаи (8-битное выравнивание, хвосты, ...). Если у вас очень специфичные случаи (32-разрядное выравнивание, делимое на 4), вы должны иметь возможность писать ядро, которое будет превышать производительность реализации драйвера с точки зрения затрат на процессор. Время выполнения GPU, вероятно, будет аналогичным.

С точки зрения эффективного написания памяти вам необходимо рассмотреть несколько ограничений на устройство.

  • Каждый SM может выдавать 1 инструкцию LSU за цикл. На Ферми вам понадобятся 2 перекоса и Кеплера, для этого вам нужно 4 искажения.
  • Каждый SM может выполнять одну запись до L2 за цикл.

Простой сопоставление 1 потока на элемент (будь то 8-разрядный или 128-разрядный) легко реализовать и довольно легко обрабатывать условные проверки, если размер не кратен WARP_SIZE.

+3

Следует отметить, что функции API-интерфейса драйвера реализованы с использованием ядер, написанных NVIDIA. Не удивительно, чтобы разработчики добились более высокой производительности со своими ядрами, особенно если разработчики используют априорные знания, на которые NVIDIA не может положиться (например, выравнивание указателя и количество байтов, на которое ссылается Грег). – ArchaeaSoftware

Смежные вопросы