- 主题:最佳memcpy实现
glibc有这个版本,触发条件不清楚。
https://sourceware.org/git/?p=glibc.git;a=commit;h=72276d6e8843db6df5971b06787f0a5e39bda138
【 在 hgoldfish 的大作中提到: 】
: linus 说 avx512 会降频。。真的有人用 avx512 搞 memcpy?
--
修改:ilovecpp FROM 124.78.168.*
FROM 124.78.168.*
dma这个真不太懂
dma可以内存到内存吗?
dma比cpu快吗?内存到内存不影响cpu吗?
允许用户态使用dma吗?
另外glibc留了个口子,对齐到页时可以操作页表作拷贝。如果内核有这个调用,那应该是大块拷贝最快的了。
【 在 javaboy 的大作中提到: 】
: 我觉得就是你总结的:glibc兜底的平台无关memcpy差不多也长这样
: 然后前面wushu查了说这是musl的代码。
: 从编程、汇编角度来说这样就可以结贴啦。再往下挖要不就聊聊总线协议和dma呗。
: ...................
--
修改:ilovecpp FROM 124.78.168.*
FROM 124.78.168.*
是的,纯粹是看这段代码眼前一亮,感慨一下板上还是有人才。没想到是musl的。可能那句“版上大部分人写不出来”刺激了一些人,纯属口快,不是有意的啊。
汇编就不是这版范围了,我以前学完编译器后端优化后,几乎再也没手撸过汇编了,年少时的得意到绝望就跟冷兵器遇见火器一样,连bootloader都用C写,lgdt这样的直接写成机器码也不用汇编,就图个汇编independent,让任何CC都能编过。
【 在 javaboy 的大作中提到: 】
: 我觉得就是你总结的:glibc兜底的平台无关memcpy差不多也长这样
: 然后前面wushu查了说这是musl的代码。
: 从编程、汇编角度来说这样就可以结贴啦。再往下挖要不就聊聊总线协议和dma呗。
: ...................
--
FROM 106.39.149.*
DMA是一类操作的统称,搞嵌入式编程的可能比较熟悉。
假设有一个任务:
memcpy(dst=0x1000, src=0x0, size=0x1000);
这个操作用一般memcpy的实现,就是类似楼主那种方式,cpu从头忙到尾,忙完了就copy完了。
但是,这个操作本质很简单,很多外设并不需要cpu辅助也可以自己实现。cpu只要告诉外设src和dst的地址,然后知道多少个时钟之后完成就行了。在很多硬件平台上,这种操作的实现可能是:
============================================================
dma_req dst, src, size
mov ecx, 0x200 #具体等待时间要根据实际情况算,这里假设等1024个时钟周期
_wait:
dec ecx
jnz _wait
============================================================
从上面可以看出cpu大部分时候是闲着的,编译器或者程序员可以自行利用这段空闲时间干别的工作。
-- DMA可以内存到内存吗?
要根据具体CPU、总线、外设的种类来判断,大多数情况可以内存到内存,可以外设到内存,可以内存到外设。
-- dma比cpu快吗?
不一定,但是dma设计没有浪费的话,一般情况下都可以达到总线的最大传输速度(扣除协议损耗)。常用总线协议有x86的pci-e和arm的axi,还有ddr接口的标准,感兴趣可以搜下它们的拓扑图和传输速率。我提到dma其实也就是因为这是memcpy理论上能达到的最快速度。
-- 内存到内存不影响cpu吗?
会影响cpu的cache的正确性。程序员需要根据情况打开/关闭cache。
-- 允许用户态使用dma吗?
要看操作系统有没有放开这个口子。技术上没有大问题。
这些知识在芯片ISA设计时会用到,学电子工程的人会熟悉一点。写游戏机模拟器的时候也会遇到。
【 在 ilovecpp (cpp) 的大作中提到: 】
: dma这个真不太懂
: dma可以内存到内存吗?
: dma比cpu快吗?内存到内存不影响cpu吗?
: 允许用户态使用dma吗?
: 另外glibc留了个口子,对齐到页时可以操作页表作拷贝。如果内核有这个调用,那应该是大块拷贝最快的了。
--
修改:javaboy FROM 114.84.111.*
FROM 114.84.111.*
orz,memcpy的永恒话题终于开始到DMA了
【 在 javaboy (喝了咖啡就话多-_-;) 的大作中提到: 】
: DMA是一类操作的统称,搞嵌入式编程的可能比较熟悉。
: 假设有一个任务:
: memcpy(dst=0x1000, src=0x0, size=0x1000);
: ...................
--
FROM 106.38.41.66
坐等过渡到FPGA
【 在 KCN 的大作中提到: 】
: orz,memcpy的永恒话题终于开始到DMA了
--
FROM 118.122.107.*
等出bug了没对齐dma一下写超了就热闹了,曾经把我一个同事差点逼死
【 在 javaboy 的大作中提到: 】
: DMA是一类操作的统称,搞嵌入式编程的可能比较熟悉。
: 假设有一个任务:
: memcpy(dst=0x1000, src=0x0, size=0x1000);
: ...................
--
FROM 213.95.148.*