繁体   English   中英

altivec提取载体的一部分?

[英]altivec extract part of the vector?

我正在尝试将一个64位值与一个64位值数组进行比较

R_UINT64 FP; R_UINT64 INPUT [20000];

如果数组中的任何元素与FP的值匹配,则返回true。

我必须遍历此数组并找到一个匹配项,我试图通过一次查看2个元素而不是一个元素来提高效率。

在Altivec中,向量长度为​​128位,因此我将FP的两个副本,两个元素放入向量中(我将它们每个向量元素都截断了两个8位)

到目前为止一切顺利,但现在我遇到了问题。 我找不到只看向量一半的VMX过程,看看是否有匹配项,为了返回true,两个值必须匹配,这不是我要寻找的。

所以我想知道是否仍然可以告诉编译器我每次只看向量的一半?

提前致谢!

最好的办法是比较这两个元素,然后使用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
}

(注意:未经测试的代码-仅供一般指导-可能需要强制转换和/或实际的错误修复!)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM