Можно ли ускорить raymarching под архитектурой SIMD? - PullRequest
1 голос
/ 05 февраля 2012

Казалось бы, ответ «нет», потому что лучевая маркировка весьма условна, т. Е. Каждый луч следует по уникальному пути выполнения, поскольку на каждом шаге мы проверяем непрозрачность, завершение и т. Д., Которые будут варьироваться в зависимости от направления отдельного луча.

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

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

Ответы [ 3 ]

1 голос
/ 15 марта 2012

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

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

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

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

1 голос
/ 31 августа 2012

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

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

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

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

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

0 голосов
/ 05 февраля 2012

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

...