![]() |
1
3
正如您所发现的,仅仅用SSE替换两个指令是行不通的,因为您需要在内存中来回移动数据,以便正确地加载SSE寄存器,而在内存中来回移动数据(构造数组的位)会破坏您的性能,因为内存非常慢(硬盘除外,内存I这些天都是瓶颈。 此外,在SSE和FPU/ALU之间,如果不使用写入RAM和读取,就无法移动数据。现代的IA32芯片可以很好地处理这种特殊的模式(先写后读),但仍然会使某些具有连锁反应的缓存失效。 为了充分利用SSE,您需要查看整个算法和算法使用的数据。A、B、C和D以及E、F、G和H的值需要永久性地存在于这些数组中,以便在加载SSE寄存器之前内存中没有移动数据。这并不简单,可能需要对代码和数据进行大量的修改(您可能需要在磁盘上以不同的方式存储数据)。 同样值得指出的是,SSE只有32位(如果使用double,则为64位),而FPU是80位(不考虑float或double),因此在使用SSE时,与使用FPU相比,会得到稍微不同的结果。只有你知道这是否会成为一个问题。 |
![]() |
2
3
您使用的是未对齐的指令,速度非常慢。 您可能需要尝试正确对齐数据、16字节边界和使用movaps。 更好的选择是使用内部函数,而不是程序集,因为编译器可以自由地按需要排序指令。 |
![]() |
3
1
您可以在较新的VS版本和可能在2005年的程序选项中启用SSE和SSE2。使用Express版本编译? 此外,SSE中的代码可能比较慢,因为当编译串行C++时,编译器是聪明的,并且在使它非常快的方面做得非常好——例如,在正确的时间自动将它们放在正确的寄存器中。例如,如果操作是串行的,编译器可以减少缓存和分页的影响。但是,内联汇编程序最多只能进行很差的优化,应该尽可能避免。 此外,您必须为SSE/2执行大量工作,才能带来显著的好处。 |
![]() |
4
1
这是一条旧线,但我注意到您的示例中有一个错误。如果要执行此操作:
那么代码应该是这样的:
为了获得更高的速度,我建议您不要对“结果”使用单独的寄存器。 对于初学者来说,并不是所有的算法都有利于在SSE中重写。数据驱动的算法(如查找表驱动的算法)不能很好地转化为SSE,因为大量的时间会丢失打包和将数据解包成向量以便SSE操作。 希望这仍然有帮助。 |
![]() |
5
0
首先,当您将128位(16字节)对齐时,您应该使用movaps,因为它可能更快。 编译器通常应该为您提供16字节的对齐,即使在32位系统上也是如此。 你的C/C++行和你的SSE代码不一样。 一个xmm寄存器中的四个浮点与另一个寄存器中的四个浮点相乘。 给你:
在SSE1中,在乘法之前必须使用SHUFP对两个寄存器中的浮点进行重新排序。 此外,对于处理比CPU缓存更大的数据,可以使用非时间存储(movntps)来减少缓存污染。 注意,在其他情况下,非时间存储速度要慢得多。 |
![]() |
AstralHex · 矩阵乘法代码工作不正常 6 月前 |
![]() |
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 6 月前 |
![]() |
Die4Toast · 递归调用成员箭头运算符-> 6 月前 |
![]() |
Anka Hanım · 关于结构和动态数组地址的问题 6 月前 |