水木社区手机版
首页
|版面-编程技术(Programming)|
新版wap站已上线
返回
下页
|
尾页
|
1/5
|
转到
主题:64 位计算机,内存地址对齐四字节还是八字节比较有效率?
楼主
|
hgoldfish
|
2023-08-07 00:25:59
|
只看此ID
假定要执行 memcpy(*dest, *src, n) 复制一段内存。正常在 amd64 计算机下,dest, src 两个指针最好是对齐的。
那么,不同的计算机架构会要求不同的对齐方式吗?还是说只要对齐到 4 个字节就行?
--
FROM 183.253.143.*
1楼
|
BigCarrot
|
2023-08-07 03:09:33
|
只看此ID
看你memcpy的实现
如果你一个字节一个字节的考,随便你怎么对齐都行
如果你32位32位的考,最好是4字节对齐
如果你64位64位的考,最好是8字节对齐
如果你用sse指令128位的考,最好是16字节对齐
如果你用avx指令256位的考,最好是32字节对齐
【 在 hgoldfish 的大作中提到: 】
: 假定要执行 memcpy(*dest, *src, n) 复制一段内存。正常在 amd64 计算机下,dest, src 两个指针最好是对齐的。
: 那么,不同的计算机架构会要求不同的对齐方式吗?还是说只要对齐到 4 个字节就行?
--
FROM 107.204.171.*
2楼
|
z16166
|
2023-08-07 09:09:20
|
只看此ID
memcpy高效实现的内部应该会对齐处理,对齐的用高速方式处理,没对齐的那一小部分字节它单独处理就行了
所以外部调用者可以不用对齐。
--
修改:z16166 FROM 123.118.191.*
FROM 123.118.191.*
3楼
|
jinjinjin3
|
2023-08-07 09:48:04
|
只看此ID
终于看到点专业了
【 在 z16166 的大作中提到: 】
: memcpy高效实现的内部应该会对齐处理,对齐的用高速方式处理,没对齐的那一小部分字节它单独处理就行了
: 所以外部调用者可以不用对齐。
:
--
FROM 117.121.60.*
4楼
|
adoal
|
2023-08-07 13:18:42
|
只看此ID
如果source和dest对的偏移不一样,比如一个余1一个余0,
那是不是就很难优化了^o^
【 在 z16166 的大作中提到: 】
: memcpy高效实现的内部应该会对齐处理,对齐的用高速方式处理,没对齐的那一小部分字节它单独处理就行了
: 所以外部调用者可以不用对齐。
--
FROM 125.119.232.*
5楼
|
z16166
|
2023-08-07 14:24:48
|
只看此ID
可以参考一下DPDK的
x86
https://github.com/cranechu/dpdk/blob/master/lib/librte_eal/common/include/arch/x86/rte_memcpy.h
https://www.intel.com/content/www/us/en/developer/articles/technical/performance-optimization-of-memcpy-in-dpdk.html?wapkw=memcpy
【 在 adoal 的大作中提到: 】
: 如果source和dest对的偏移不一样,比如一个余1一个余0,
: 那是不是就很难优化了^o^
:
--
FROM 123.118.191.*
6楼
|
ArchLinux
|
2023-08-07 15:47:22
|
只看此ID
一般来说是优化load吧,就是把source对齐,因为程序的延迟来源于load,
load需要等内存中读回来的数才能做后续操作,store的话指令发出去就不用理它了。
【 在 adoal 的大作中提到: 】
: 如果source和dest对的偏移不一样,比如一个余1一个余0,
: 那是不是就很难优化了^o^
--
FROM 111.206.173.*
7楼
|
leadu
|
2023-08-07 17:32:30
|
只看此ID
装个vc,主要体系架构的源代码都有,我这的是在
C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.36.32532\crt\src\
下面,打开memcpy.asm,内容都在里面
x64的我看了一下,注释比代码都多,非常适合新手学习入门,可以明白什么叫软件工业
实在懒得装可以看看
https://gist.github.com/Const-me/3290266d2a5f51409eb813d39b28007c
这个代码不知道是哪个版本的,不建议看
vc x64这个memcpy.asm写的不错,常见的问题都处理了,
不是专门做这块的一线工程师写出这份来,花费时间搞不好要一个月以上了
上面z16166发的intel的实现
https://github.com/cranechu/dpdk/blob/master/lib/librte_eal/common/include/arch/x86/rte_memcpy.h
代码质量比vc这份差点,但也说的过去
敲黑板,注意精神,下面有搞笑的,libgcc的
https://github.com/gcc-mirror/gcc/blob/master/libgcc/memcpy.c
初学者算法课上日常作业水平...
这就是我为什么老是吐槽开源社区,东西缺乏设计感,个个像玩具
【 在 hgoldfish 的大作中提到: 】
: 假定要执行 memcpy(*dest, *src, n) 复制一段内存。正常在 amd64 计算机下,dest, src 两个指针最好是对齐的。
: 那么,不同的计算机架构会要求不同的对齐方式吗?还是说只要对齐到 4 个字节就行?
--
FROM 114.248.175.*
8楼
|
z16166
|
2023-08-07 18:40:25
|
只看此ID
假如预期的对齐是N字节,
a = src % N,
b = dst % N,
a、b不相等而且都不为0时,应该是最坏的情况,
1、如果这个硬件还支持N/2、N/4、N/8的对齐,可以缩小对齐粒度来搞,
比如N = 4, a = 1, b = 3时,按4字节对齐来操作比较麻烦,但可以用2字节对齐来操作。
2、按上面ArchLinux的说法,只保证src、dst之一对齐。leadyu说的VC的memcpy.asm里有一部分代码是这样的,区分vmovdqu、vmovdqa指令。
1和2哪个速度快,未知。而且1的分支判断比较麻烦。
【 在 adoal 的大作中提到: 】
: 如果source和dest对的偏移不一样,比如一个余1一个余0,
: 那是不是就很难优化了^o^
:
--
修改:z16166 FROM 123.118.191.*
FROM 123.118.191.*
9楼
|
adoal
|
2023-08-07 22:57:30
|
只看此ID
但是正常的GNU版libc runtime是glibc,libgcc是gcc的内部用库。
(好吧,其实glibc的也就算还凑合)
【 在 leadu 的大作中提到: 】
: 装个vc,主要体系架构的源代码都有,我这的是在
: C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.36.32532\crt\src\
: 下面,打开memcpy.asm,内容都在里面
: ...................
--
修改:adoal FROM 125.119.232.*
FROM 125.119.232.*
下页
|
尾页
|
1/5
|
转到
选择讨论区
首页
|
分区
|
热推
BYR-Team
©
2010.
KBS Dev-Team
©
2011
登录完整版