Есть ли предпочтение с SIMD всегда избавляться от ветвления?

Если вы пишете какой-нибудь 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 ответ

Решение

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

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

Другие вопросы по тегам