DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: melqui
今日帖子: 12
在线用户: 31
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
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%。
----------------------------------------------
武汉天气不好
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
2021/11/1 18:15:10
1楼: 先赞后看!
----------------------------------------------
-
作者:
男 sunnyshuoxx (sunnywang) ▲△△△△ -
普通会员
2021/11/1 21:41:02
2楼: mORMot 作者对一楼的评论:
1. 反编译你的 obj 文件,发现你用的是另外一个开源项目的代码。 你不开源,违反了开源协议。
2. 一大堆其它技术细节问题。

你自已看吧。

https://synopse.info/forum/viewtopic.php?pid=36144#p36144
----------------------------------------------
-
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
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都没有问题。
----------------------------------------------
-
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
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 哈 ~
----------------------------------------------
-
作者:
男 keymark (嬲) ▲▲▲△△ -
普通会员
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/
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
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
----------------------------------------------
-
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
2021/11/3 1:04:52
8楼: 我自己修改编译的部分标准C库函数的OBJ文件,放在这个github里

https://github.com/YWtheGod/ZSTD4Delphi/tree/master/LIBCSubSet

注意我删掉了CPU体系判断代码,默认走AVX架构,不支持INTEL家N系赛扬
----------------------------------------------
-
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
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,都测试了一遍。
  偶有胜负,的确没有什么优势了。

  以后直接用楼上的就🆗了。非常感谢指点!
----------------------------------------------
武汉天气不好
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
2021/11/3 8:53:15
10楼: @dbyoung 不,我跑的就是fastmemcpy_avx
----------------------------------------------
-
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
2021/11/3 9:02:27
11楼: 奥,看来不同的 CPU,测试出来的数据有差异(我是至强CPU)。
----------------------------------------------
武汉天气不好
作者:
男 kwer (★★★★★) ★☆☆☆☆ -
普通会员
2021/11/3 10:15:45
12楼: up
----------------------------------------------
==========-==========-==========-==========-==========
     多隆, 给我备一匹最快的马, 我有事要走先~~~
==========-==========-==========-==========-==========
作者:
男 doorkey (DoorKey) ★☆☆☆☆ -
盒子活跃会员
2021/11/10 21:43:32
13楼: @roadrunner  你的这个LIBCSubSet 有没有没删除CPU体系的代码, 我发现很多AMD的CPU也不支持
----------------------------------------------
QQ: 9717005 我的Blog:http://www.cnblogs.com/anydelphi/
作者:
男 wiseinfo (wisienfo) ★☆☆☆☆ -
普通会员
2021/11/13 9:16:25
14楼: 葵花宝典
----------------------------------------------
-
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
2021/11/13 9:42:08
15楼: @doorkey, 我在64位是强制使用AVX, I系的CPU就是N系赛扬从来不支持AVX,A系的ZEN开始的应该都没问题,但是ZEN以前的A U的确可能是不支持的,ZEN之前的A U太弱势了,低性能高功耗,可能我主观上就将它忽略掉了
----------------------------------------------
-
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
2021/11/13 10:13:03
15楼: mORMot2 针对 Delphi 11 进行了 AVX X64 优化。速度也是杠杠的。

测试源码(垂直翻转,纯粹的内存复制):
  https://github.com/dbyoung720/ImageGray/blob/master/src/db.Image.GeometricTrans.pas

原帖地址:
  https://synopse.info/forum/viewtopic.php?pid=35817#p35817

测试效率:
  mORMot2 的 MoveFast 在 x86 下比系统自带的快 50%,与 memmove 持平。
  mORMot2 的 MoveFast 在 x64 下比系统自带的快 50%,比 memmove 略快。
  这是我的本本 CPU(I7-9750H)测试下来的效率。

题外话:
  我本想将这个垂直翻转函数进行并行化。
  但有个内存创建过程,放到并行代码中,程序是正确了,但效率又受影响了。反复的内存创建、释放。
  放到并行代码外部,程序也不正确。
  不知道咋整。不知道有没有高手不吝指点。
----------------------------------------------
武汉天气不好
作者:
男 doorkey (DoorKey) ★☆☆☆☆ -
盒子活跃会员
2021/11/15 11:13:56
16楼: @dbyoung 这个不错, 我先用着
----------------------------------------------
QQ: 9717005 我的Blog:http://www.cnblogs.com/anydelphi/
作者:
男 doorkey (DoorKey) ★☆☆☆☆ -
盒子活跃会员
2021/11/16 11:16:03
17楼: @roadrunner 我主要是32位的C端有很多电脑很旧, 32位的程序只要支持SSE2就可以?
----------------------------------------------
QQ: 9717005 我的Blog:http://www.cnblogs.com/anydelphi/
作者:
男 doorkey (DoorKey) ★☆☆☆☆ -
盒子活跃会员
2021/11/16 12:46:37
18楼: @roadrunner 你编译的优化程序要AVX2才行, 有客户的机子有AVX也是运行不了
----------------------------------------------
QQ: 9717005 我的Blog:http://www.cnblogs.com/anydelphi/
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
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,否则就不支持。
----------------------------------------------
-
作者:
男 doorkey (DoorKey) ★☆☆☆☆ -
盒子活跃会员
2021/11/17 10:16:10
20楼: @roadrunner  32位的能不能编译个最低SSE2的??
----------------------------------------------
QQ: 9717005 我的Blog:http://www.cnblogs.com/anydelphi/
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
2021/11/17 11:43:32
21楼: 我编译的有32和64两套OBJ, 32位应该是原本就是SSE2的,应当不会有兼容问题
----------------------------------------------
-
作者:
男 doorkey (DoorKey) ★☆☆☆☆ -
盒子活跃会员
2021/11/18 20:49:48
22楼: @roadrunner  确实在比较旧的赛杨CPU上不行. 直接就报错
----------------------------------------------
QQ: 9717005 我的Blog:http://www.cnblogs.com/anydelphi/
作者:
男 doorkey (DoorKey) ★☆☆☆☆ -
盒子活跃会员
2022/1/15 20:55:51
23楼: @roadrunner  ZSTD的GCC编译命令能不能发一下. 谢谢
----------------------------------------------
QQ: 9717005 我的Blog:http://www.cnblogs.com/anydelphi/
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行83.98438毫秒 RSS