Вопрос

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

У меня есть регистр четырех векторов (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 вы бы сделали это, сравнивая и маскируя (кусочко и). Вы используете инструкцию сравнения, которая затем генерирует маску, которую вы обычно можете использовать для этого.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top