2013-09-16 3 views
1

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

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 
} 

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

+1

я вижу !!! Большое спасибо Пол !!! –

+0

Обратите внимание, что если вы используете 64-разрядную POWER или PowerPC, это может быть не намного быстрее, чем просто прямое скалярное сравнение с 64-разрядным регистром, но стоит попробовать, если вам нужно небольшое улучшение производительности. –

+0

Привет, Пол, оригинальный вопрос не позволяет мне реализовывать массивное параллельное программирование. Мне интересно ... так или иначе, чтобы хм загружать значение на вектор по одному за раз? скажем, 32 бита, могу ли я загрузить один 32-битный int за раз, а не сразу загружать 4? Благодаря! –

 Смежные вопросы

  • Нет связанных вопросов^_^