2012-02-05 2 views
1

Ответ будет отрицательным, поскольку raymarching является очень условным, т. Е. Каждый луч следует за уникальным путем выполнения, поскольку на каждом шаге мы проверяем непрозрачность, завершение и т. Д., Которые будут меняться в зависимости от направления отдельного луча.Может ли raymarching ускоряться под архитектурой SIMD?

Таким образом, похоже, что SIMD в значительной степени не сможет ускорить это; скорее, MIMD потребуется для ускорения.

Имеет ли это смысл? Или я что-то пропустил?

ответ

1

Как отмечалось уже, вероятно, можно получить ускорение от реализации вашей векторной математики с использованием инструкций SSE (быть в курсе эффектов обсуждается here - и для другого подхода). Такой подход позволил бы код оставаться кратким и ремонтопригодным.

Я полагаю, однако, ваш вопрос о «пакетном обходом» (или что-то вроде этого), другими словами, чтобы обрабатывать несколько скалярных значений каждого из различного луча:

В принципе это должно быть возможно откладывая затенение на другой проход. Пакет SIMD может быть заселен новым лучом, как только голый проход завершается, а временный результат сохраняется как вход для затенения . Это позволит распараллелить определенный, зависящий от случая процент вашего кода, в котором будут показаны все четыре SIMD-полосы. Плитка изображения и индексация лучей внутри него в Morton-порядке может быть хорошей идеей, чтобы избежать давления в кеше (если ваша геометрия строго процедурная).

Вы не будете знать, платит ли это, если вы не попробуете. Я предполагаю, что если это , то количество ускорений может не стоить усложнения кода всего за четыре полосы.

Рассматривали ли вы использование архитектуры SIMT, такой как программируемый графический процессор? Несколько современных программируемых графических плат позволяет выполнять raymarching по интерактивным тарифам (см. Это происходит в вашем браузере here).

+0

Просто [добавить к вашему ответу] (http://www.yosefk.com/blog/simd-simt-smt- parallelism-in-nvidia-gpus.html) для других, которые не уверены в различиях между SIMT и SIMD. –

0

Только в том случае, если SSE, например, позволяет выполнять операции над векторами параллельно.

1

В последние дни я построил на основе программного обеспечения raymarcher для губчатой ​​губки. В настоящий момент без использования SIMD и я также не использовал специального алгоритма. Я просто отслеживаю от -1 до 1 в X и Y, которые являются U и V для целевой текстуры. Затем я получил положение камеры и место назначения, которое я использую для вычисления вектора инкремента для raymarch.

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

По моему мнению, должно быть возможно распараллеливать эти операции с помощью SSE1/2, так как можно разрешить ветвь путем нулевого поля в векторе (__m64/__m128), поэтому дальнейшие операции SIMD здесь не будут применяться , Это действительно зависит от того, что вы raymarch/-cast, но если вы просто вычислите цвет фрагмента из функции (например, моя фрактальная кривая здесь) и не получаете доступ к памяти нелинейно, есть некоторые трюки, чтобы сделать это возможным.

Несомненно, этот ответ содержит предположения, но я буду информировать вас, когда я распараллеливал эту процедуру.

+0

Спасибо, да бросьте заметку здесь, если/когда вы это сделали ... –