трассировка лучей с помощью CUDA - PullRequest
11 голосов
/ 02 сентября 2008

В настоящее время я использую raytracer. Поскольку трассировка лучей чрезвычайно сложна для вычислений, и поскольку я все равно буду изучать программирование на CUDA, мне было интересно, есть ли у кого-нибудь опыт объединения этих двух. Я не могу точно сказать, соответствуют ли вычислительные модели, и я хотел бы знать, чего ожидать. У меня создается впечатление, что это не совсем совпадение на небесах, но приличное увеличение скорости было бы лучше, чем ничего.

Ответы [ 4 ]

21 голосов
/ 19 сентября 2008

В CUDA следует с большой осторожностью относиться к тому, что расходящийся поток управления в коде вашего ядра абсолютно УБИВАЕТ производительность благодаря структуре базового аппаратного обеспечения графического процессора. Графические процессоры обычно имеют массивно параллельные рабочие нагрузки с высококогерентным потоком управления (т. Е. У вас есть пара миллионов пикселей, каждый из которых (или, по крайней мере, большие полосы) будет работать с одним и тем же шейдером , точным ). программа, даже проходя одно и то же направление через все ветви. Это позволяет им проводить некоторые аппаратные оптимизации, например, иметь только один кэш команд, модуль выборки и логику декодирования для каждой группы из 32 потоков. В идеальном случае, который является распространенным в графике они могут транслировать одну и ту же инструкцию всем 32 наборам исполнительных блоков в одном и том же цикле (это известно как SIMD или несколько данных с одной командой). Они могут эмулировать MIMD (несколько инструкций) ) и SPMD (однопрограммный), но когда потоки внутри потокового мультипроцессора (SM) расходятся (отбирают разные пути кода из ветви), логика проблемы фактически переключается между каждым путем кода на циклической основе. Можно представить, что в худшем случае, когда все нить Это происходит по разным путям, ваше аппаратное использование просто уменьшилось в 32 раза, что фактически убило любую выгоду, которую вы бы получили, работая на GPU через CPU, особенно с учетом накладных расходов, связанных с маршалингом набора данных из CPU, по сравнению с PCIe, к графическому процессору.

Тем не менее, трассировка лучей, в некотором смысле параллельная данным, имеет широко расходящийся поток управления даже для скромно сложных сцен. Даже если вам удастся отобразить пучок плотно расположенных лучей, которые вы выбросили прямо рядом друг с другом, на один и тот же SM, данные и расположение инструкций, которые вы имеете для первоначального отскока, не будут сохраняться очень долго. Например, представьте, что все 32 высоко когерентных луча отражаются от сферы. После этого отскока они все пойдут в совершенно разных направлениях и, вероятно, будут поражать объекты, сделанные из разных материалов, с разными условиями освещения и так далее. Каждый материал и набор условий освещения, окклюзии и т. Д. Имеет свой собственный поток команд, связанный с ним (для вычисления рефракции, отражения, поглощения и т. Д.), И поэтому становится довольно трудно запустить один и тот же поток команд даже в значительной части темы в СМ. Эта проблема, связанная с современным состоянием кода трассировки лучей, снижает использование вашего графического процессора в 16–32 раза, что может сделать производительность неприемлемой для вашего приложения, особенно если оно работает в режиме реального времени (например, в игре). Это все еще может быть лучше, чем процессор, например ферма рендеринга.

В исследовательском сообществе сейчас появляется новый класс ускорителей MIMD или SPMD. Я бы рассматривал их как логические платформы для программного обеспечения, трассировки лучей в реальном времени.

Если вам интересны задействованные алгоритмы и их отображение в коде, посмотрите POVRay. Также посмотрите на фотонное картирование, это интересная техника, которая даже на шаг ближе к представлению физической реальности, чем трассировка лучей.

9 голосов
/ 02 сентября 2008

Это, безусловно, можно сделать, это было сделано, и в настоящее время это горячая тема среди гуру трассировки лучей и Cuda. Я бы начал с просмотра http://www.nvidia.com/object/cuda_home.html

Но это в основном проблема исследования. Люди, которые делают это хорошо, получают рецензируемые исследовательские работы из этого. Но хорошо на этом этапе все еще означает, что лучшие результаты GPU / Cuda примерно конкурентоспособны с лучшими в своем классе решениями на CPU / многоядерных процессорах / SSE. Поэтому я думаю, что еще немного рано предполагать, что использование Cuda ускорит трассировку лучей. Проблема в том, что, хотя трассировка лучей «смущающе параллельна» (как говорится), это не та проблема «фиксированного размера ввода и вывода», которая напрямую отображается в графические процессоры - вам нужны деревья, стеки, динамические структуры данных и т. Д. . Это может быть сделано с Cuda / GPU, но это сложно.

Ваш вопрос был неясен относительно уровня вашего опыта или целей вашего проекта. Если это ваш первый трассировщик лучей и вы просто пытаетесь научиться, я бы избегал Cuda - вам понадобится 10 раз больше, чтобы развиться, и вы, вероятно, не получите хорошую скорость. Если вы немного опытный программист на Cuda и ищете сложный проект, а трассировка лучей - это просто увлекательная штука, чтобы научиться ей, во что бы то ни стало, попробуйте сделать это в Cuda. Если вы создаете коммерческое приложение и хотите получить конкурентное преимущество в скорости - ну, на данном этапе это, вероятно, просто дерьмо ... вы можете получить преимущество в производительности, но за счет более сложной разработки и зависимость от конкретного оборудования.

Перепроверьте через год, ответ может быть другим после другого или двух поколений скорости GPU, разработки компилятора Cuda и опыта исследовательского сообщества.

6 голосов
/ 07 сентября 2011
4 голосов
/ 29 сентября 2008

Nvidia продемонстрировала трассировщик лучей в CUDA на своей конференции NVision в этом году. Вот ссылка на их слайды об этом.

http://www.nvidia.com/object/nvision08-IRT.html

...