我需要简单的ZeroMemory实现SSE(SSE2首选) 有人可以帮忙吗?我正在通过SO和网络进行搜索,但没有找到直接答案。
答案 0 :(得分:4)
ZeroMemory()
或memset()
不够好吗?
免责声明:以下某些内容可能是SSE3。
push
保存xmm reg pxor
将xmm reg归零movdqa
或movntdq
执行写入pop
恢复xmm reg。 movntdq
可能看起来更快,因为它告诉处理器不要将数据带入缓存,但如果要使用数据,这可能会导致性能下降。如果你在释放内存之前擦洗内存可能更合适(就像你使用SecureZeroMemory()
那样)。
答案 1 :(得分:1)
我想加速你的代码,而不是完全了解你的CPU如何工作以及瓶颈在哪里。
这里是你的速度优化程序,只是为了展示应该如何制作。
在我的电脑上比你快了大约5倍(清除1MBytes mem块),测试它并询问是否有些想法不清楚:
//edx = memory pointer must be 16 bytes aligned
//ecx = memory count must be multiple of 16
xorps xmm0, xmm0 //Clear xmm0
mov eax, ecx //Save ecx to eax
and ecx, 0FFFFFF80h //Clear only 128 byte pages
jz @ClearRest //Less than 128 bytes to clear
@Aligned128BMove:
movdqa [edx], xmm0 //Clear first 16 bytes of 128 bytes
movdqa [edx + 10h], xmm0 //Clear second 16 bytes of 128 bytes
movdqa [edx + 20h], xmm0 //...
movdqa [edx + 30h], xmm0
movdqa [edx + 40h], xmm0
movdqa [edx + 50h], xmm0
movdqa [edx + 60h], xmm0
movdqa [edx + 70h], xmm0
add edx, 128 //inc mem pointer
sub ecx, 128 //dec counter
jnz @Aligned128BMove
@ClearRest:
and eax, 07Fh //Clear the rest
jz @Exit
@LoopRest:
movdqa [edx], xmm0
add edx, 16
sub eax, 16
jnz @LoopRest
@Exit:
答案 2 :(得分:0)
CPU中的几乎所有晶体管都用于以某种方式尽可能快地进行存储器访问。 CPU在所有内存访问中都做得非常出色,并且指令的运行速度比可能的内存访问速度快得多。
因此,在大多数情况下,尝试击败memset是一项徒劳无益的练习,因为它已经受到记忆速度的限制(正如其他人所说)。