Altivec извлечь часть вектора?

Я пытаюсь сравнить одно 64-битное значение с массивом 64-битных значений, скажем

R_UINT64 FP; R_UINT64 INPUT[20000];

Возвращает true, если какой-либо элемент в массиве соответствует значению FP.

Я должен пройтись по этому массиву и найти соответствие, я пытаюсь повысить эффективность, рассматривая одновременно 2 элемента вместо одного.

В Altivec длина вектора равна 128 битам, поэтому я помещу две копии FP, два элемента в векторы (я усекаю их обоих по два 8-битных элемента вектора)

Пока все хорошо, но теперь я столкнулся с проблемой. Я не смог найти процедуру VMX, которая просматривает только половину вектора и проверяет, есть ли совпадение, чтобы вернуть true, оба значения должны совпадать, а это не то, что я ищу.

Так что мне интересно, можно ли сказать компилятору, что я смотрю только половину вектора каждый раз?

Заранее спасибо!

1 ответ

Наверное, лучше всего сравнить два элемента, а затем использовать vec_mergeh/vec_mergel проверить каждую половину результата, например

size_t vec_search_u64(const uint64_t key, const uint64_t array[], const size_t len)
{
    const vector signed int vkey = { key >> 32, key & 0xffffffff, key >> 32, key & 0xffffffff };
    const vector bool int vk1 = { -1, -1, -1, -1 };

    for (i = 0; i < len - 1; i += 2)      // iterate two elements at a time
    {
        vector signed int v = vec_ld(0, (int *)&array[i]);
                                          // load 2 elements
        vector bool int vcmp = vec_cmpeq(v, vkey);
                                          // compare 2 elements with key
        if (vec_all_eq(vec_mergeh(vcmp, vcmp), vk1))
        {                                 // if high element matches
            return i;                     // return match found at element i 
        }
        if (vec_all_eq(vec_mergel(vcmp, vcmp), vk1))
        {                                 // if low element matches
            return i + 1;                 // return match found at element i + 1
        }
    }
    if (i < len)                          // if array size is odd
    {
        if (array[i] == key)              // test last element
        {
            return i;
        }
    }
    return (size_t)(-1);                      // match not found - return suitable value
}

(Примечание: непроверенный код - только для общего руководства - может потребоваться приведение и / или фактические исправления ошибок!)

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