如何在 SVE Gather-Load 内部函数中处理具有 32 位通道寄存器的 64 位指针?

How to Handle 64-Bit Pointers with 32-Bit Lane Registers in SVE Gather-Load Intrinsics?

提问人:ature 提问时间:9/27/2023 最后编辑:Peter Cordesature 更新时间:9/27/2023 访问量:35

问:

SVE 提供各种聚集加载内部函数。例如,加载到 .svuint32_t m = svld1_gather_u32_offset_u32(svbool_t pg, const uint32_t *base, svuint32_t offsets)base[i]im

或者,您可以使用 将元素加载到 .每个基数通道都包含一个 32 位内存地址,因为基数的类型为 。但是,AArch64(SVE 需要)指针是 64 位。64 位指针如何适应 32 位通道?svuint32_t k = svld1_gather_u32base_u32(svbool_t pg, svuint32_t bases)ksvuint32_t

我假设只有当指针碰巧适合 32 位时才能使用第二种变体。由于无法保证这一点,那么第二种方法的实用性如何?

我试图阅读生成的汇编代码,但由于这不是我的强项,因此对我没有进一步的帮助。

SIMD ARM64 内部函数 SVE

评论

0赞 Peter Cordes 9/27/2023
是的,如果您有原始指针,但它们每个指针适合 32 位,则 asm 可以使用 base=0 和指针作为偏移向量,假设没有单独的指令形式。(未缩放;否则,如果 34 位指针都指向对齐的 dwords,则使用右移 2 且缩放因子为 4 的指针。如果您有任意 64 位指针,则需要将它们用作 64 位偏移量(如果 SVE 具有 x86 的等效指针)。vpgatherqd
0赞 Peter Cordes 9/27/2023
实用性如何?从一个 4GiB 的大竞技场中分配您的数据(因此您可以使用固定的 ),或使用数组索引。或者使用 Linux 分配低 4GiB,以便指针作为 base=0 的 32 位偏移量起作用。basemmap(MAP_32BIT)
1赞 Nate Eldredge 9/27/2023
ARM64 有一个 ILP32 ABI,其中整个程序适合 4GB,指针确实是 32 位。因此,这种内在因素可以在该环境中使用。我本来想猜这个形式只是基寄存器的特殊情况,但似乎不是。它实际上是一种指令形式,它接受一个 5 位即时指令,该即时指令左移 2 位并添加到每个索引中,这是该即时为 0 的特殊情况。u32basexzr
0赞 solidpixel 9/29/2023
如果您确实需要 64 位指针,那么svld1_gather_u64base_u64,并随后减少。

答: 暂无答案