gpt4 book ai didi

c - altivec 提取部分 vector ?

转载 作者:太空宇宙 更新时间:2023-11-04 02:54:53 26 4
gpt4 key购买 nike

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

R_UINT64 FP;R_UINT64 输入[20000];

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

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

在 Altivec 中, vector 长度是 128 位,所以我将把 FP 的两个副本, vector 中的两个元素。(我将每个 vector 元素都截断两个 8 位)

到目前为止一切顺利,但现在我遇到了一个问题。我找不到只查看 vector 的一半并查看是否匹配的 VMX 程序,为了返回 true,两个值都必须匹配,这不是我要找的。

所以我想知道是否有办法告诉编译器我每次只查看 vector 的一半?

提前致谢!

最佳答案

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

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

关于c - altivec 提取部分 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18837961/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com