Как использовать инструкцию сравнения NEON (больше или равно)?

Как вообще пользоваться инструкциями сравнения NEON?

Вот случай, который я хочу использовать, инструкция «Больше или равно»?

В настоящее время у меня есть,

int x;
...
...
...
if(x >= 0)
{
....

}

В NEON я хотел бы использовать x таким же образом, только на этот раз x является вектором.

int32x4_t x;

...
...
...

if(vcgeq_s32(x, vdupq_n_s32(0))) // Whats the best way to achieve this effect?
{
....

}

person HaggarTheHorrible    schedule 24.09.2010    source источник
comment
Я только что добавил пример кода в stackoverflow.com/questions/47320062/   -  person user2084572    schedule 21.11.2017


Ответы (1)


С SIMD непросто перейти от одного скаляра if/then к проверке нескольких элементов. Обычно вы хотите проверить, больше ли какой-либо элемент или больше ли все элементы, и обычно для каждого случая будут разные SIMD-предикаты, которые вы можете поместить внутри if (...). Однако я не вижу ничего подобного в NEON, так что вам может не повезти.

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

person Paul R    schedule 25.09.2010
comment
Павел, я модифицировал свой алгоритм, теперь я избавился от условий ветвления, поэтому мне не нужны эти условия if(...) и я просто выполняю прямые арифметические операции с помощью SIMD. - person HaggarTheHorrible; 28.09.2010