- 主题:最佳memcpy实现
根据实际硬件不同,也有可能这个是最佳的。
如果瓶颈在ddr ram上,比如极端情况用DDR-400搭配主频很高的cpu,那四次*s++=*d++和一次movq很可能是一样快的。movq可以空出一些流水线给超线程用。至于是否用得上那也不保证。反正单线程benchmark很可能看上去差不多。
intel的cpu对我们程序员来说是个黑盒子。厂家不会公开说它是怎么优化的。没准它的decoder认识连续四条*s++=*d++,会自动翻译成和movq一样的微码。这是完全可以做到,而且很可能已经做了的。唯一确保最佳性能的办法就是做实验测,摸清每个指令的延迟多少,对流水线的影响多大,对cache的影响多大。。。慢慢把黑盒的内部结构给逆向工程出来。(做JIT编译器的人主要就是做这些工作)
我见过有一个网站专门测试并公开这些数据的,回头收藏夹里看看,如果能找到就贴上来给你们。
【 在 hgoldfish (老鱼) 的大作中提到: 】
: 这个不可能是最佳实现。。在现代处理器上面,单字节访问非常慢。
: 你发的这种实现无非是朴素实现的简单推广:
: 1. 没考虑内存地址对齐
: 2. 至少用个戴夫设备吧。
: 3. 用 simd 指令集一次复制 32 字节才是王道啊。
: edit: 有内存地址对齐。
--
FROM 114.84.111.*
问这个目的并不是考察谁会特定体系的汇编。我也见过直接上汇编的人,但是考察的不是这个目的,而是看能否把脑子里想到的反应在手上。我都一大把年纪了还优越感。面试问那些人一个个都说得头头是道,看过libc代码等等,怎样怎样。结果一上手,说过的要点全都写不上去,板擦擦了一遍又一遍的,这不是眼高于手么。
手贱,放狗搜了下,这段代码是musl的,行了,质疑的都歇了吧。我还以为是卤煮自己撸的。
【 在 javaboy 的大作中提到: 】
: x86汇编是domain knowledge。面试时用这种题去测试,只能测出一个人是否知道这些知识,无法准确衡量他解决问题的能力。这虽然满足了面试官自身的优越感,却大概率错失合适的人才,还浪费双方时间。我觉得并不值得推荐。
: 你说的和汇编比除了无法用SSE,这句是不对的。主流编译器通过intrinsic函数把几乎所有SIMD指令都提供给C/C++用户了,你可以自己确认一下。不要低估本版深度。
:
--
FROM 106.39.149.*
楼主贴这段,字节对齐的,否则它搞一堆位运算是为什么。
glibc兜底的平台无关memcpy差不多也长这样。
【 在 lushan5436 的大作中提到: 】
: ARM指令,字节不对齐,转int会报错,你不考虑?
: 就算是X86,windows的实现(比早年linux实现好多了)也考虑比这多,不信你调试时去看汇编。
: 没有说不如我:我说的是,如果写C程序,怎么不可能考虑字节对齐的问题?怎么可能还不知道sse2加速?
: ...................
--
修改:ilovecpp FROM 124.78.168.*
FROM 124.78.168.*
别一口汇编什么的,本屌丝初中debug玩16位dos汇编、大二对着intel手册玩IA64汇编时也觉得汇编牛。那又怎样,再牛能有搞后端优化的深入?
纯手撸代码看的是脑手配合,不是刁难谁,更不是写不好就通不过。现实中有编译器内嵌代码用谁会写memcpy啊。
【 在 lushan5436 的大作中提到: 】
: ARM指令,字节不对齐,转int会报错,你不考虑?
: 就算是X86,windows的实现(比早年linux实现好多了)也考虑比这多,不信你调试时去看汇编。
: 没有说不如我:我说的是,如果写C程序,怎么不可能考虑字节对齐的问题?怎么可能还不知道sse2加速?
: ...................
--
FROM 106.39.149.*
神童啊,除了跪拜无话可说。
【 在 lvsoft 的大作中提到: 】
: 嗯,达到了我高一时候的水平
--
FROM 106.39.149.*
没用rep movsd的都是渣渣
【 在 octavo 的大作中提到: 】
: [upload=1][/upload]
--
修改:somebody FROM 112.11.39.*
FROM 112.11.39.*
中间隔着cache呢,哪能这么比。
这种通用实现也不追求最优。具体平台上用movsq乃至avx512的实现都有。
【 在 javaboy 的大作中提到: 】
: 根据实际硬件不同,也有可能这个是最佳的。
: 如果瓶颈在ddr ram上,比如极端情况用DDR-400搭配主频很高的cpu,那四次*s++=*d++和一次movq很可能是一样快的。movq可以空出一些流水线给超线程用。至于是否用得上那也不保证。反正单线程benchmark很可能看上去差不多。
: intel的cpu对我们程序员来说是个黑盒子。厂家不会公开说它是怎么优化的。没准它的decoder认识连续四条*s++=*d++,会自动翻译成和movq一样的微码。这是完全可以做到,而且很可能已经做了的。唯一确保最佳性能的办法就是做实验测,摸清每个指令的延迟多少,对流水线的影响多大,对cache的影响多大。。。慢慢把黑盒的内部结构给逆向工程出来。(做JIT编译器的人主要就是做这些工作)
: ...................
--
FROM 124.78.168.*
我前面写完以后删掉了一段“如果瓶颈在sram cache上,那肯定是simd快”的描述,因为我觉得写罗嗦了,删了也不影响我的观点。现在你给我补充回来了。。。
【 在 ilovecpp (cpp) 的大作中提到: 】
: 中间隔着cache呢,哪能这么比。
: 这种通用实现也不追求最优。具体平台上用movsq乃至avx512的实现都有。
--
FROM 114.84.111.*
我觉得就是你总结的:glibc兜底的平台无关memcpy差不多也长这样
然后前面wushu查了说这是musl的代码。
从编程、汇编角度来说这样就可以结贴啦。再往下挖要不就聊聊总线协议和dma呗。
【 在 ilovecpp (cpp) 的大作中提到: 】
: 中间隔着cache呢,哪能这么比。
: 这种通用实现也不追求最优。具体平台上用movsq乃至avx512的实现都有。
--
FROM 114.84.111.*
linus 说 avx512 会降频。。真的有人用 avx512 搞 memcpy?
【 在 ilovecpp (cpp) 的大作中提到: 】
: 中间隔着cache呢,哪能这么比。
: 这种通用实现也不追求最优。具体平台上用movsq乃至avx512的实现都有。
--
FROM 112.47.122.*