XMM寄存器中的取消引用指针(收集)

留申科

如果我在SSE或AVX寄存器中打包了一些指针或类似指针的值,是否有任何特别有效的方法将它们解引用另一个此类寄存器中?(“特别有效”的意思是“比仅对值使用内存更有效”。)是否有任何方法可以在不将寄存器的中间副本写入内存的情况下全部取消引用它们?

为澄清起见进行编辑:这意味着,假设使用32位指针和SSE,使用XMM寄存器的四个部分立即将其索引到四个任意存储区中,并将四个结果立即返回到另一个寄存器中。或尽可能接近“一次”。(/编辑)

Edit2:感谢PaulR的回答,我想我要寻找的术语是“收集”,因此问题是“在AVX2之前的系统中实现收集的最佳方法是什么?”。

我假设没有关于此的指令,因为……据我所知,似乎还不存在,而且似乎它根本不是SSE所设计的。

(“类似指针的值”的含义类似于假装为堆的数组中的整数索引;在机械上非常不同,但从概念上讲是相同的。例如,如果要使用32位或什至16位值,而无论本机指针大小,以适应寄存器中的更多值。)


我想到了为什么可能要这样做的两个可能原因:

  • 认为探索将SSE寄存器用于通用...可能很有意思...也许有四个相同的“线程”处理可能完全不相关/不连续的数据,“垂直”而不是“水平”地切分寄存器(即代替设计使用它们的方式)。

  • 如果出于某种原因(可能不是一个好方法)构建romcc之类的东西,而又不想将任何内容写到内存中,则需要更多的寄存器存储。

这听起来像是XY问题,但并非如此,只是好奇/愚蠢。拿到锤子后,我会去找钉子。

保罗·R

这个问题尚不完全清楚,但是如果要取消引用向量寄存器元素,那么唯一可能对您有帮助的指令就是AVX2收集的负载,例如_mm256_i32gather_epi32 et al请参阅《英特尔内在指南》的“ AVX2”部分

SYNOPSIS

__m256i _mm256_i32gather_epi32 (int const* base_addr, __m256i vindex, const int scale)
#include "immintrin.h"
Instruction: vpgatherdd ymm, vm32x, ymm
CPUID Flag : AVX2

DESCRIPTION

Gather 32-bit integers from memory using 32-bit indices. 32-bit elements are loaded from addresses starting at base_addr and offset by each 32-bit element in vindex (each index is scaled by the factor in scale). Gathered elements are merged into dst. scale should be 1, 2, 4 or 8.

OPERATION

FOR j := 0 to 7
    i := j*32
    dst[i+31:i] := MEM[base_addr + SignExtend(vindex[i+31:i])*scale]
ENDFOR
dst[MAX:256] := 0

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

打印XMM寄存器中的值

来自分类Dev

如何从复制垃圾收集器中的寄存器转发指针?

来自分类Dev

如何截断XMM寄存器中的浮点值

来自分类Dev

如何写入XMM寄存器中LLDB

来自分类Dev

在eBPF程序中访问xmm寄存器

来自分类Dev

从地址位置加载XMM寄存器

来自分类Dev

将指针存储在特定寄存器的c中

来自分类Dev

指向数组C中的寄存器值的指针

来自分类Dev

在xmm和ml64中的通用寄存器之间移动四字?

来自分类Dev

为什么不将功能参数存储在XMM向量寄存器中?

来自分类Dev

有没有办法增加xmm寄存器中的值?

来自分类Dev

__m128什么时候在xmm寄存器中?

来自分类Dev

测试xmm寄存器中的任何字节是否为0

来自分类Dev

将xmm寄存器折叠为标量

来自分类Dev

如何将NaN插入xmm寄存器?

来自分类Dev

将xmm寄存器推入堆栈时出现错误

来自分类Dev

将xmm寄存器折叠为标量

来自分类Dev

为什么mulsd不将xmm *寄存器相乘

来自分类Dev

解决 Windows 调用约定保留 xmm 寄存器?

来自分类Dev

将xmm寄存器的2 32个浮点数扩展到整个xmm寄存器

来自分类Dev

MSP430寄存器上的按位运算符,无需取消引用

来自分类Dev

通过引用传递寄存器变量

来自分类Dev

为什么将32位寄存器移到堆栈然后从堆栈移到xmm寄存器?

来自分类Dev

使用-O *时如何在GCC中禁用RBP帧指针寄存器优化?

来自分类Dev

将xmm寄存器的低两个32位浮点数扩展到整个xmm寄存器

来自分类Dev

STM32F446xx使用解除引用的指针和结构之间的外围寄存器访问差异

来自分类Dev

gcc中的全局寄存器变量

来自分类Dev

VHDL寄存器中的延迟

来自分类Dev

在verilog中定义寄存器

Related 相关文章

热门标签

归档