我想在amd64程序集中用零填充4096字节的数组(与4096字节边界对齐)。我正在寻找便携式和单CPU类型的解决方案。
我知道rep stosq
可以解决问题,但有什么更快的吗? MMX? SSE?它快多少?一条指令可以写入内存多少字节(没有rep
)?我们可以假设内存缓存为空。我不需要一个完全正常工作的函数实现,我只需要基本的想法及其关键的汇编指令。
我刚看到movdqa
指令,一次可写16个字节。它的速度是每个8字节的2 mov
条指令的两倍吗?
答案 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中的一个原因)。