Сравнение с поплавками в неоновой внутренней
-
25-10-2019 - |
Вопрос
Я думаю, что это глупая проблема, но я попытался на один день, чтобы решить это без удачи, так что вот так.
У меня есть регистр четырех векторов (float32x4), и я хочу сделать некоторый процесс на некоторых из них, а другой я хочу установить его на 0.
Например, эта проблема в C:
for (int i=1; i<=4; i++)
{
float b = 4/i;
if(b<=3)
result += process(b);
}
Таким образом, первый не будет обрабатываться, но другой будет, поэтому мне нужен регистр, где у меня есть 0, а другой - результат.
Но я не знаю, как это сделать на неоновой внутренней.
Я знаю, что есть vcltq_f32, но я попробовал с этим и без результата.
Решение
Как это:
const float32x4_t vector_3 = vdupq_n_f32(3.0f);
uint32x4_t mask = vcleq_f32(vector_b, vector_3);
vector_b = (float32x4_t)vandq_u32((uint32x4_t)vector_b, mask);
Другие советы
Я мало что знаю о неоне, но в большинстве архитектур SIMD вы бы сделали это, сравнивая и маскируя (кусочко и). Вы используете инструкцию сравнения, которая затем генерирует маску, которую вы обычно можете использовать для этого.