memopt
记录一下阅读memcpy/memcmp/memmove时碰到的一些问题
memcmp
在plain版本中,copy 大块会调用__vm_copy函数按页为单位进行拷贝。此时只是将页面设置为copy on write,待目的地址被写入数据时,才会调用copy_page函数按页面为单位进行数据copy。copy_page的实现如下。
x86
位置:linux/arch/x86/lib/copy_page_64.S
1 |
|
loongarch
位置:arch/loongarch/mm/page.S
1 |
|
其实和arm64的实现几乎一致
有以下两个问题:
为什么未使用预取指令(loongarch64的预取指令是preld和preldx)?
copy_page的访存行为非常简单,现代cache的硬件预取器已足够预取。
一次循环拷贝128字节数据,为什么不一次性从源地址中取出128字节?
这会使得寄存器压力过大
为什么边取数据边存数据,不能取完再统一存入吗?
cache读写都有对应的端口,存取数据可以并行执行
memopt
http://example.com/memopt/