Я пытаюсь реализовать случайный лес в CUDA, причем каждый поток является отдельным деревом решений, для которого требуется рекурсия. Однако мой компьютер не поддерживает рекурсию в CUDA. Поэтому я пытаюсь использовать структуры данных, такие как очередь, для выполнения рекурсивной части. Я искал googled, но я не могу найти много информации об этом, и я попытался использовать Thrust внутри ядра CUDA, но он не будет компилироваться .. Так есть способ использовать очередь внутри ядра CUDA? Спасибо заранее!Структуры данных в ядре CUDA
ответ
CUDA и вычисления графического процессора в целом, быстро , только если все потоки выполняют одно и то же: (ну, технически каждые 32 потока должны выполняться точно так же на большинстве аппаратных средств). Графические процессоры имеют множество вычислительных блоков, но мало управляющий поток возможностей.
- в 3D-графике, вы применяете ту же самую проекцию для всех вершин, а затем применить те же шейдеры для всех пикселей и т.д.
- матричных умножений: вы точно такой же порядок операций, только на разных частях данных.
Это то, для чего было оптимизировано оборудование. Деревья принятия решений (и, следовательно, случайные леса) не являются подобными. Вы будете использовать разные ветви if/else в каждом дереве. Так что это не подходит для графических процессоров. Вы получите ужасную эффективность ветвей. Ваша производительность снизится до менее 1/32 (т. Е. 3%) теоретических возможностей вашего оборудования.
Из Википедии CUDA ограничений:
Филиалов в программном коде существенно не влияют на производительность, при условии, что каждый из 32 нитей имеет тот же выполнение путь
же путь выполнения = все 32 потоков сделайте ветку «if true», или все 32 сделайте ветку «else».
(«Обход» вокруг этого, но это довольно дорого ИМХО, и я не думаю, что он будет полностью конкурирующим с подходами, которые предназначены для графических процессоров, например, с помощью матричных умножений сразу. ленивый, чтобы набрать его - вы наверняка найдете его в литературе GPU. Это довольно часто, чтобы ускорить работу . Если это возможно для нескольких уровней if, это будет намного менее эффективно, поскольку стоимость растущий экспоненциально с глубиной. Иногда либо компилятор CUDA, либо процессор могут оптимизировать это автоматически для простых/неглубоких случаев.)
- 1. Какие структуры данных доступны в ядре Linux
- 2. Эквивалент usleep() в ядре CUDA?
- 3. 2 переменные в ядре CUDA
- 4. Использование cublasStbsv в ядре CUDA
- 5. Использование memset в ядре CUDA
- 6. Создание вектора в ядре cuda
- 7. Код C++ в ядре CUDA?
- 8. Блокировка процесса в ядре Cuda
- 9. C++ структуры данных и CUDA
- 10. Перегрузка оператора присваивания в ядре CUDA
- 11. Дизайн иерархии нитей в ядре в CUDA
- 12. Неявный конструктор в ядре ядра CUDA
- 13. счетных регистров/нить в Cuda ядре
- 14. Перемещение элементов между массивами в ядре CUDA
- 15. Вызов оператора new в ядре CUDA
- 16. Подсчитайте количество циклов в ядре CUDA
- 17. Почему z всегда нулевое в ядре CUDA
- 18. Как вызвать функцию хоста в ядре CUDA?
- 19. CUDA 2d массив адресации в ядре
- 20. Почему этот оператор в ядре CUDA медленный?
- 21. Поиск упорядоченного массива в ядре CUDA
- 22. CUDA Динамическое распределение памяти в ядре
- 23. CUDA - Создание объектов в ядре и использование их на хосте
- 24. Mocking FromSql в ядре структуры сущности?
- 25. Как проверить наличие сбоя malloc() в ядре CUDA?
- 26. Как использовать структуры данных Cuda в файлах .cpp
- 27. Копирование структуры в память устройства CUDA
- 28. Как передать структуры в устройство CUDA?
- 29. Постоянное использование хоста с плавающей точкой в ядре в CUDA
- 30. Создание случайного числа в ядре Cuda в различном диапазоне
Если вы можете имитировать истинные вызовы функций, вы можете построить фальшивую рекурсивную функцию с кучей используя дополнительные параметры. Или вы можете оптимизировать хвостовую рекурсию и преобразовать в итеративную версию. Или вы можете динамически объявлять такие функции, как f() f_1() f_11() f_12() для каждой входной версии оригинала f. –