现代amd64 CPU上最快的memset方法

时间:2014-03-12 20:40:02

标签: assembly x86-64 memset

我想在amd64程序集中用零填充4096字节的数组(与4096字节边界对齐)。我正在寻找便携式和单CPU类型的解决方案。

我知道rep stosq可以解决问题,但有什么更快的吗? MMX? SSE?它快多少?一条指令可以写入内存多少字节(没有rep)?我们可以假设内存缓存为空。我不需要一个完全正常工作的函数实现,我只需要基本的想法及其关键的汇编指令。

我刚看到movdqa指令,一次可写16个字节。它的速度是每个8字节的2 mov条指令的两倍吗?

1 个答案:

答案 0 :(得分:2)

通过查看Agner Fog asmlib中文件memset64.asm中的源代码,可以找到问题的答案。

他的代码有一个AVX和SSE的版本。据我所知,对于某个大小小于_mm256_store_ps (vmovaps)的数组,代码会MemsetCacheLimit。对于较大的数组大小,他使用_mm256_stream_ps (vmovntps)进行非临时存储。还有其他几个因素会影响结果。看代码。对于使用内部函数的C / C ++的大多数情况,你可能会获得相同的性能。

请注意,GCC中的内置memset函数以及我检查过的glibc中的版本都是not optimized(这是memset在asmlib中的一个原因)。