【问题标题】:Accessing to mm1 register parts访问 mm1 寄存器部件
【发布时间】:2010-12-21 17:02:14
【问题描述】:

是否可以访问 mmx 寄存器中的单个字节,例如数组? 我有这个代码:

movq mm1,vector1
movq mm2,vector2
psubw mm1,mm2

我想把 mm1[1],mm1[2],mm1[3]....放到 c++ vars 中,比如:

int a,b=0;
mov a,mm1[1]
mov b,mm1[2]

谢谢。

【问题讨论】:

    标签: c++ x86 sse simd mmx


    【解决方案1】:

    除非您想使用 VJo 的方法,否则无法直接寻址 MMX 寄存器中的字节,但这完全破坏了首先使用 MMX 的好处。

    但是,如果您有合适格式的数据,则可以将它们全部放在寄存器中并执行一系列解包操作,这将转置数据。

    顺便说一句,您为什么不使用 SSE1/2/3/4? MMX 相当过时。 IIRC SSE4 具有直接的 8/16/32/64 位提取指令。

    【讨论】:

    • 我需要展示使用 MMX 的好处。而且我需要使用两个数组进行操作,它们会提取这个位置来填充对象。但是,还有其他可能吗?
    • 为什么不能展示 SSE2 的好处,例如,每个不到 6 年的 CPU 都支持,并且功能更强大
    • +1 表示“MMX 已相当过时”,但放弃“相当”。今天没有理由为 MMX 编码。使用 SSE。
    • @Stephon - 如果不了解有关人员的情况,我们不能这么说。仍然有一些 MMX(非 SSE)单元在生产中使用。升级可能不是一种选择。没关系,一些模拟器可能也没有超过那个点的支持。 MMX 可能是唯一的选择。
    • @Brian:是的,仍然有不支持 SSE 的遗留系统。但是,如果在工程工作正在进行的性能关键型环境中使用任何设备,我会感到非常惊讶。比较购买当今可用的绝对最便宜的 x86 系统(将支持 SSE,并且比任何不支持 SSE 的旧系统快几个数量级)的成本与支付熟练工程师手工操作的成本调整 MMX 代码。这很简单。
    【解决方案2】:

    是的,有可能。

    我可以展示 C++ 的 SSE2 的代码,但对于 MMX 类似:

    __m128i a;
    unsigned char *p = (unsigned char*) &a;
    // access bytes pointed by pointer p
    

    【讨论】:

    • 编译器必须将整个寄存器复制到堆栈,然后做一些指针运算来计算地址,然后它会提取字节。所以这个解决方案不是那么有用。
    • @buratinas 如果寄存器已经在堆栈上,则不会。顺便说一句,确认这一点的唯一方法是检查编译器的输出。你做到了吗?
    • 我很确定,因为没有指示这样做。此外,当数据在堆栈上时进行 any 计算会带来很大的伤害。如果可以接受这样的开销,那么使用 SIMD 的目的是什么?
    • @buratinas SIMD 指令通常在循环中使用。如果您使用除 SIMD 指令之外的任何其他指令,您将获得巨大的性能影响。但是,我不知道寄存器不能在堆栈上。你能提供一个链接来解释它为什么不好吗?
    • 我说的不是堆栈上的寄存器,而是从 MMX 寄存器中提取字节。没有任何指令可以做到这一点。因此,如果我们在 MMX 寄存器中有数据并且想要提取字节,我们必须将该寄存器复制到堆栈并进行指针运算等,因此 SIMD 不可用。当多个数组中有一堆数据时(只需要原始寻址),可以使用它,可以使用整个寄存器存储/加载来复制数据,并使用涉及整个扩展寄存器的指令进行处理。
    猜你喜欢
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 2022-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    相关资源
    最近更新 更多