Как работает CUDA cudaMemset()
функция? Я наблюдал значительное экономию времени, если инициализация памяти реализована путем запуска количества потоков = количество элементов. Почему такая экономия достигается?Как реализована cudaMemset?
ответ
cudaMemset вызывает cuMemsetD8 или cuMemsetD8Aysnc. Это легко определить в инструментах. Реализация драйвера будет пытаться оптимизировать выполнение на основе выравнивания адреса назначения, размера значения для записи и количества байтов для записи. Это легко определить, написав несколько эталонных тестов. Реализация CUDA должна обрабатывать все случаи (8-битное выравнивание, хвосты, ...). Если у вас очень специфичные случаи (32-разрядное выравнивание, делимое на 4), вы должны иметь возможность писать ядро, которое будет превышать производительность реализации драйвера с точки зрения затрат на процессор. Время выполнения GPU, вероятно, будет аналогичным.
С точки зрения эффективного написания памяти вам необходимо рассмотреть несколько ограничений на устройство.
- Каждый SM может выдавать 1 инструкцию LSU за цикл. На Ферми вам понадобятся 2 перекоса и Кеплера, для этого вам нужно 4 искажения.
- Каждый SM может выполнять одну запись до L2 за цикл.
Простой сопоставление 1 потока на элемент (будь то 8-разрядный или 128-разрядный) легко реализовать и довольно легко обрабатывать условные проверки, если размер не кратен WARP_SIZE.
Следует отметить, что функции API-интерфейса драйвера реализованы с использованием ядер, написанных NVIDIA. Не удивительно, чтобы разработчики добились более высокой производительности со своими ядрами, особенно если разработчики используют априорные знания, на которые NVIDIA не может положиться (например, выравнивание указателя и количество байтов, на которое ссылается Грег). – ArchaeaSoftware
- 1. cudaMemset номер строки
- 2. cudaMemset не получить аргумент
- 3. cudaMemset не удалось установить все значения 0
- 4. cudaMemset не кажется, чтобы установить требуемое значение
- 5. cudaMemset не работает на переменной __device__
- 6. Как реализована иерархия вызовов
- 7. Как реализована виртуализация приложений?
- 8. Как реализована угловая директива?
- 9. Как dynamic_cast реализована
- 10. Как реализована BigDecimal?
- 11. Как реализована функция Collection.sort?
- 12. Как реализована функция numpy.cov()?
- 13. Как реализована рекурсия в Java
- 14. Как реализована функция .NET PointToClient?
- 15. Как реализована функциональность взаимодействия blend?
- 16. Как реализована функция квадратного корня?
- 17. Как реализована структура изоляции Moles?
- 18. Как реализована хэш-карта JavaScript?
- 19. Как реализована удаленная отладка вообще
- 20. Как реализована реализация std :: string?
- 21. Как реализована технология «ok google»
- 22. Как реализована многозадачность iPad/iPhone?
- 23. Как фабрика реализована внутри UVM?
- 24. Как реализована «Google-продвижение/восстановление»?
- 25. Как стеганография реализована в php
- 26. Как реализована встроенная функция str.lower()?
- 27. Как настойчивость реализована в Дарте?
- 28. Как многозадачность реализована в Python?
- 29. Как бесконечность реализована в javascript?
- 30. sched_getattr: функция не реализована
Взгляните на эту презентацию: http://mc.stanford.edu/cgi-bin/images/b/ba/M02_2.pdf – paulsm4