Есть ли предпочтение с SIMD всегда избавляться от ветвления? - PullRequest
2 голосов
/ 18 января 2012

Если вы пишете какой-нибудь SIMD-код, который будет запускаться другой программой, всегда ли выгодно избавляться от ветвлений для повышения производительности?Я слышал, что даже выполнение дополнительных операций только для того, чтобы избежать if/else операторов и т. Д., Все еще происходит намного быстрее.

Я спрашиваю об этом, потому что у меня есть некоторые ветвления, которые я делаю, что в основном так:

//  axis; x=0, y=1, z=2

float p, q;
if (axis == 0)
{
    p = point.y;
    q = point.z;
}
else if (axis == 1)
{
    p = point.x;
    q = point.z;
}
else if (axis == 2)
{
    p = point.x;
    q = point.y;
}

Можно ли избежать такого разветвления с помощью хитрого трюка?

1 Ответ

3 голосов
/ 18 января 2012

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

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

...