|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
|
2021/11/1 9:11:58 |
标题: |
分享:超快速的内存复制 move_sse、move_avx |
浏览:3617 |
|
加入我的收藏 |
楼主: |
https://github.com/dbyoung720/FastMove
move_sse、move_avx 比系统自带的 move 函数快了将近 300%。 比 mORMot2 的 MoveFast 函数快了将近 50%。
----------------------------------------------
武汉天气不好 |
作者: |
|
2021/11/1 18:15:10 |
1楼: |
先赞后看!
----------------------------------------------
-
|
作者: |
|
2021/11/1 21:41:02 |
2楼: |
mORMot 作者对一楼的评论: 1. 反编译你的 obj 文件,发现你用的是另外一个开源项目的代码。 你不开源,违反了开源协议。 2. 一大堆其它技术细节问题。
你自已看吧。
https://synopse.info/forum/viewtopic.php?pid=36144#p36144
----------------------------------------------
-
|
作者: |
|
2021/11/1 23:02:21 |
3楼: |
delphi的move指令,在win32下是汇编代码,用的是X87指令,一次搬动8字节数据 在WIN64下是纯PASCAL代码,没有用汇编 在其他平台上(LINUX/ANDROID/IOS/MAC OS)上,是转向调用了C标准库的memmove()函数。
一般来说,标准C库中的memmove(或者memcpy, 两者是同一个代码)的优化程度是可以绝对放心的,那么多年沉淀,早就被各路大神优化到登峰造极的程度了,所以只有WIN平台下的实现还有提升空间,而提升的路数我认为最简单的就是直接抄标准C库的源码就行了。
你安装了Visual C++的话,在你的硬盘里直接就可以找出memcpy.asm文件(2个,一个i386一个amd64), 或者懒得安装C++的话,直接在网上搜memcpy.asm, 看清楚作者是microsoft的就可以。
vc++的memcpy.asm一共7XX行,考虑了各种因素,同时带有判断CPU架构的代码在里头,我通常是删掉CPU架构判定代码直接默认使用AVX指令集,代价就是不支持INTEL家N系赛扬CPU,其他所有的X86 CPU都没有问题。
----------------------------------------------
-
|
作者: |
|
2021/11/2 7:51:12 |
4楼: |
回2楼,我看了。
1、在发这个源码之前,我已经在 mORMot2 issues 中说过了, 那份 VC 源码 FastMemcpy 来自哪里。给了链接。 本意是希望大神可以看看,如果有改进的地方,可以改进,放到 mORMot2 中。造福大众。 https://github.com/synopse/mORMot2/issues/63 2、什么反 obj,什么隐瞒源码来源,无稽之谈;
3、VC 的那份代码要在 Delphi 下编译使用,要做些修改;想看源码的,见上1;
4、用空间换时间,是很多优化的标准做法。体积大小没有那么重要;
5、我的测/试不够专业。只测/试了 1024 字节的复制。 做其它大小的测/试,修改一下 1024 为其它值,也很容易。 大神说的测/试方法,我水平低,还没有弄懂,还在研究中;
6、关于小尺寸的内存复制,像2楼比较喜欢看代码的人,可以自己去看源码。 对小尺寸、中尺寸、大尺寸,FastMemcpy 源码中,都作了分别处理。 至于有没有 CPU 污染,大家可以自行测/试。也可以去作者的博客看看。 http://www.skywind.me/blog/。有 3 篇文章关于内存拷贝优化的。 synopse 的官博上,关于内存拷贝优化,也说了,MoveFast 在复制8字节倍数时,效果最好。 7、跨平台测/试,我此等小虾米,哪有那水平。
大家在实际项目中、试试,好用就用,不好用就不用。我不负任何责任的哈。
一切以大神说的为准!
----------------------------------------------
武汉天气不好
|
作者: |
lsuper (lsuper) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2021/11/2 9:49:43 |
5楼: |
是先 star 后看,鼓励 delphi opensource 哈 ~
----------------------------------------------
-
|
作者: |
|
2021/11/2 15:45:45 |
6楼: |
https://github.com/skywind3000/FastMemcpy/blob/master/LICENSE
----------------------------------------------
[alias] co = clone --recurse-submodules up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/>http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
|
作者: |
|
2021/11/3 0:55:16 |
7楼: |
现在这个年代,再用VS2019跑一次那个FASTMEMCPY的代码,你就会发现对比标准库的memcpy, 这种优化已经完全没有优势了, 我用VS2019跑了一次,结果贴在下面:
benchmark(size=32 bytes, times=16777216): result(dst aligned, src aligned): memcpy_fast=39ms memcpy=12 ms result(dst aligned, src unalign): memcpy_fast=56ms memcpy=6 ms result(dst unalign, src aligned): memcpy_fast=39ms memcpy=4 ms result(dst unalign, src unalign): memcpy_fast=79ms memcpy=18 ms
benchmark(size=64 bytes, times=16777216): result(dst aligned, src aligned): memcpy_fast=59ms memcpy=10 ms result(dst aligned, src unalign): memcpy_fast=43ms memcpy=25 ms result(dst unalign, src aligned): memcpy_fast=44ms memcpy=22 ms result(dst unalign, src unalign): memcpy_fast=42ms memcpy=31 ms
benchmark(size=512 bytes, times=8388608): result(dst aligned, src aligned): memcpy_fast=87ms memcpy=120 ms result(dst aligned, src unalign): memcpy_fast=100ms memcpy=122 ms result(dst unalign, src aligned): memcpy_fast=110ms memcpy=122 ms result(dst unalign, src unalign): memcpy_fast=85ms memcpy=109 ms
benchmark(size=1024 bytes, times=4194304): result(dst aligned, src aligned): memcpy_fast=57ms memcpy=72 ms result(dst aligned, src unalign): memcpy_fast=55ms memcpy=87 ms result(dst unalign, src aligned): memcpy_fast=78ms memcpy=97 ms result(dst unalign, src unalign): memcpy_fast=58ms memcpy=76 ms
benchmark(size=4096 bytes, times=524288): result(dst aligned, src aligned): memcpy_fast=24ms memcpy=50 ms result(dst aligned, src unalign): memcpy_fast=20ms memcpy=32 ms result(dst unalign, src aligned): memcpy_fast=23ms memcpy=34 ms result(dst unalign, src unalign): memcpy_fast=43ms memcpy=56 ms
benchmark(size=8192 bytes, times=262144): result(dst aligned, src aligned): memcpy_fast=39ms memcpy=21 ms result(dst aligned, src unalign): memcpy_fast=44ms memcpy=46 ms result(dst unalign, src aligned): memcpy_fast=39ms memcpy=35 ms result(dst unalign, src unalign): memcpy_fast=27ms memcpy=51 ms
benchmark(size=1048576 bytes, times=2048): result(dst aligned, src aligned): memcpy_fast=87ms memcpy=68 ms result(dst aligned, src unalign): memcpy_fast=76ms memcpy=68 ms result(dst unalign, src aligned): memcpy_fast=86ms memcpy=69 ms result(dst unalign, src unalign): memcpy_fast=78ms memcpy=94 ms
benchmark(size=4194304 bytes, times=512): result(dst aligned, src aligned): memcpy_fast=136ms memcpy=140 ms result(dst aligned, src unalign): memcpy_fast=128ms memcpy=145 ms result(dst unalign, src aligned): memcpy_fast=125ms memcpy=160 ms result(dst unalign, src unalign): memcpy_fast=128ms memcpy=134 ms
benchmark(size=8388608 bytes, times=256): result(dst aligned, src aligned): memcpy_fast=224ms memcpy=270 ms result(dst aligned, src unalign): memcpy_fast=218ms memcpy=273 ms result(dst unalign, src aligned): memcpy_fast=195ms memcpy=248 ms result(dst unalign, src unalign): memcpy_fast=222ms memcpy=265 ms
benchmark random access: memcpy_fast=261ms memcpy=234ms
----------------------------------------------
-
|
作者: |
|
2021/11/3 1:04:52 |
8楼: |
我自己修改编译的部分标准C库函数的OBJ文件,放在这个github里
https://github.com/YWtheGod/ZSTD4Delphi/tree/master/LIBCSubSet
注意我删掉了CPU体系判断代码,默认走AVX架构,不支持INTEL家N系赛扬
----------------------------------------------
-
|
作者: |
|
2021/11/3 8:42:09 |
9楼: |
@roadrunner: 你用 memcpy_fast(sse) 和 VS 的 memcpy 做的测试吧。 memcpy,VS 默认使用 AVX 优化。应该使用 memcpy_fast(avx)测试,这样才公平些。
我用 VS2019、VS2022,x86、x64下,SSE、AVX,和 VS 自带的 memcpy,都测试了一遍。 偶有胜负,的确没有什么优势了。
以后直接用楼上的就🆗了。非常感谢指点!
----------------------------------------------
武汉天气不好
|
作者: |
|
2021/11/3 8:53:15 |
10楼: |
@dbyoung 不,我跑的就是fastmemcpy_avx
----------------------------------------------
-
|
作者: |
|
2021/11/3 9:02:27 |
11楼: |
奥,看来不同的 CPU,测试出来的数据有差异(我是至强CPU)。
----------------------------------------------
武汉天气不好
|
作者: |
kwer (★★★★★) |
★☆☆☆☆ |
-
|
普通会员 |
|
2021/11/3 10:15:45 |
12楼: |
up
----------------------------------------------
==========-==========-==========-==========-========== 多隆, 给我备一匹最快的马, 我有事要走先~~~ ==========-==========-==========-==========-==========
|
作者: |
|
2021/11/10 21:43:32 |
13楼: |
@roadrunner 你的这个LIBCSubSet 有没有没删除CPU体系的代码, 我发现很多AMD的CPU也不支持
----------------------------------------------
QQ: 9717005 我的Blog:http://www.cnblogs.com/anydelphi/
|
作者: |
|
2021/11/13 9:16:25 |
14楼: |
葵花宝典
----------------------------------------------
-
|
作者: |
|
2021/11/13 9:42:08 |
15楼: |
@doorkey, 我在64位是强制使用AVX, I系的CPU就是N系赛扬从来不支持AVX,A系的ZEN开始的应该都没问题,但是ZEN以前的A U的确可能是不支持的,ZEN之前的A U太弱势了,低性能高功耗,可能我主观上就将它忽略掉了
----------------------------------------------
-
|
作者: |
|
2021/11/15 11:13:56 |
16楼: |
@dbyoung 这个不错, 我先用着
----------------------------------------------
QQ: 9717005 我的Blog:http://www.cnblogs.com/anydelphi/
|
作者: |
|
2021/11/16 11:16:03 |
17楼: |
@roadrunner 我主要是32位的C端有很多电脑很旧, 32位的程序只要支持SSE2就可以?
----------------------------------------------
QQ: 9717005 我的Blog:http://www.cnblogs.com/anydelphi/
|
作者: |
|
2021/11/16 12:46:37 |
18楼: |
@roadrunner 你编译的优化程序要AVX2才行, 有客户的机子有AVX也是运行不了
----------------------------------------------
QQ: 9717005 我的Blog:http://www.cnblogs.com/anydelphi/
|
作者: |
|
2021/11/16 15:55:48 |
19楼: |
@doorkey
我记得我查过英特尔家的就只有N系列赛扬不支持AVX2,J系列和G系列的赛扬都支持AVX2
AMD家的我当时的确没考虑,因为老AMD的CPU实在不受我待见,当时只是确定ZEN以后的肯定支持AVX2,我再查了一下,AMD是从第7代APU(ZEN之前的最后一代APU)开始支持AVX2的
第7代APU记得也是采用AM4接口的,从此AMD的CPU插座就没换过,所以简单地说,采用AM4插座的AMD CPU,全都支持AVX2,否则就不支持。
----------------------------------------------
-
|
作者: |
|
2021/11/17 10:16:10 |
20楼: |
@roadrunner 32位的能不能编译个最低SSE2的??
----------------------------------------------
QQ: 9717005 我的Blog:http://www.cnblogs.com/anydelphi/
|
作者: |
|
2021/11/17 11:43:32 |
21楼: |
我编译的有32和64两套OBJ, 32位应该是原本就是SSE2的,应当不会有兼容问题
----------------------------------------------
-
|
作者: |
|
2021/11/18 20:49:48 |
22楼: |
@roadrunner 确实在比较旧的赛杨CPU上不行. 直接就报错
----------------------------------------------
QQ: 9717005 我的Blog:http://www.cnblogs.com/anydelphi/
|
作者: |
|
2022/1/15 20:55:51 |
23楼: |
@roadrunner ZSTD的GCC编译命令能不能发一下. 谢谢
----------------------------------------------
QQ: 9717005 我的Blog:http://www.cnblogs.com/anydelphi/
|
|