Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 访问mm1寄存器部件_C++_X86_Sse_Simd_Mmx - Fatal编程技术网

C++ 访问mm1寄存器部件

C++ 访问mm1寄存器部件,c++,x86,sse,simd,mmx,C++,X86,Sse,Simd,Mmx,是否可以访问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] 谢谢。是的,这是可能的 我可以显示SSE2的C++代码,但对于MMX:是类似的。 __m128i a; unsigned char *p = (unsigned char*) &

是否可以访问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]
谢谢。

是的,这是可能的

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

是类似的。
__m128i a;
unsigned char *p = (unsigned char*) &a;
// access bytes pointed by pointer p

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

但是,如果数据格式良好,则可以将它们全部放在寄存器中并执行一系列解包操作,这将转换数据


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

编译器必须将整个寄存器复制到堆栈中,然后执行一位指针算术来计算地址,然后它将提取字节。因此,如果寄存器已经在堆栈上,这个解决方案就没有那么好用了。@buratinas。顺便说一句,确认这一点的唯一方法是检查编译器的输出。是你干的吗?我肯定,因为没有指示要这么做。此外,当数据在堆栈上时进行任何计算都会造成很大的伤害。如果可以接受这样的开销,那么使用SIMD的目的是什么?@buratinas SIMD指令通常在循环中使用。如果您使用SIMD指令以外的任何指令,您将获得巨大的性能损失。但是,我不知道寄存器不能在堆栈上。你能提供一个链接来解释为什么它不好吗?我说的不是堆栈上的寄存器,而是从MMX寄存器中提取字节。没有指令能做到这一点。因此,如果我们在MMX寄存器中有数据,并且想要提取字节,我们必须将该寄存器复制到堆栈中,并执行指针算术等操作,因此SIMD不可用。当多个数组中有大量数据时(只需要原语寻址),数据可以使用整个寄存器存储/加载进行复制,并使用涉及整个扩展寄存器的指令进行处理。我需要演示使用MMX的好处。我需要使用两个数组,它们提取这个位置来填充对象。但是,还有其他的可能性吗?例如,为什么你不能演示SSE2的好处,每个使用不到6年的CPU都支持SSE2,而且它的功能更强大,因为“MMX已经相当过时了”,而放弃“相当过时了”。今天没有理由为MMX编码。使用SSE。@Stephon-我们不能在不了解更多相关人员情况的情况下这样说。仍有一些MMX(非SSE)装置仍在生产中使用。升级可能不是一个选项。尽管有些仿真器可能没有超过这一点的支持。MMX可能是唯一的选择。@布赖恩:是的,仍然有一些遗留系统不支持SSE。然而,如果在工程工作正在进行的性能关键型环境中有任何应用,我会非常惊讶。将购买当今最便宜的x86系统(支持SSE,并且比任何不支持SSE的遗留系统快几个数量级)的成本与支付熟练工程师手动调整MMX代码的成本进行比较。这是不需要动脑筋的。