Как в этом случае себя ведет SIMD?

Я использую движок, который позволяет писать SIMD-код, и он работает быстро. Но есть только один блок, в котором есть весь код.

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

Например:

void simdFunction ()
{
    center = mesh.center();    // always the same
    vert.pos.x = center.x;    // run on each vertex
}

В этом случае центр всегда один и тот же, поэтому будет ли он рассчитываться для каждой вершины на SIMD? Если да, то насколько это эффективно?

В принципе, возможность запускать это параллельно перевешивает затраты на его вычисление независимо от общего смысла программирования SIMD?


person Joan Venge    schedule 16.01.2012    source источник


Ответы (1)


этот код запускается независимо на каждой сущности одновременно

Нет, SIMD работает не так.

В SIMD все арифметические устройства работают синхронно, выполняя идентичные операции. Никакой независимости нет.

Как правило, лучше вычислять общие константы только один раз в последовательном коде. Таким образом, механизм SIMD будет тратить меньше времени на каждый срез вершин.

Исключением может быть случай, если вычисление короткое, SIMD является сопроцессором (например, GPGPU), и данные уже находятся в этом сопроцессоре. Тогда вычисление его с использованием SIMD может легко превзойти перемещение данных обратно в последовательный процессор и обратно.

person Ben Voigt    schedule 16.01.2012
comment
Спасибо, Бен, теперь я, кажется, понимаю это лучше. Но я не могу это контролировать. Спецификация движка определяет, что у меня может быть только один контекст SIMD. Я могу написать другие функции и т. Д., Но как только я вызову их в основном контексте, это будет то же самое. Так что, думаю, у меня нет выбора. - person Joan Venge; 17.01.2012