首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C/C++ - posix_memalign()

C/C++ - posix_memalign()
EN

Stack Overflow用户
提问于 2010-07-30 09:48:02
回答 1查看 3.6K关注 0票数 6

我阅读了一些关于缓存错过优化的内容,并了解了这个stdlib函数。它为优化做了某种内存对齐,但是any1能帮助我解释这个函数到底做了什么吗?它采用3个参数:void* * memptr、size_t对齐方式、size_t大小

我不明白的是文件的含义

“在对齐指定的边界上对齐所分配的大小字节.”

我从阅读中理解的是分配一个内存块大小为大小的函数,但在那之后,我不明白它们是什么“边界”.是内存块被分解成更小的块,大小是对齐的吗?

以下是文档:memalign.html

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-30 10:59:32

我阅读了一些关于缓存错过优化的内容,并了解了这个stdlib函数。它为优化做了某种内存对齐,但是any1能帮助我解释这个函数到底做了什么吗?

该函数的主要目的是分配一个与页面大小一致的缓冲区。这很少是为了性能而做的--通常是因为需要一个适合设备驱动程序/直接硬件访问的缓冲区。

大部分性能与内存对齐问题已经由编译器自己解决了。例如,所有基本类型-- char、short、int、long --都已在内存中(或struct内部)自然对齐:变量(或struct的字段)的地址可被变量的大小所除。为了达到这个目的,使用了填充。(例如,在char a; int b;中,a之后将添加sizeof(char)-sizeof(int)字节,以确保b的地址在sizeof(b)上对齐。)

我不明白他们所说的“边界”是什么意思.这是内存块被分解成小块与大小对齐吗?

H/W装置(尤指))通常将内存看作N个字节上的块,每次只能访问N个字节。上下文中的边界是块的开始,就像在“块边界”中。

现在,我不情愿地提到了对性能的影响。记住,过早的优化是万恶之源。这些技巧具有高度的平台性和特定的CPU特性,因此通常不应使用:

  • 在某些情况下,当您想要提高数据的局部性时,需要页面大小对齐。用于将虚拟地址转换为物理RAM位置的CPU维护缓存。更少的页面代码访问,更少的压力,增加CPU。(大多数OSs已经尝试优化应用程序的页面布局,以尽量减少virt到phys地址转换的开销。)如果您知道您经常访问的结构适合于单个页面,那么最好将其放入页对齐存储中,以确保它包含在单个页面中。malloc()不提供有保证的结构,可能会将结构放在一个页面开始,另一个页面结束--跨越页面边界--从而占用TLB中的两个条目,而不是所需的单个条目。(如何查找页面大小.)
  • 高速缓存线对准虽然应用程序可以以字节来寻址内存,但实际上CPU只能访问物理RAM块,通常称为“缓存线”。这是物理RAM最小的可寻址单元。通过使用结构的缓存行对齐方式,可以最大限度地减少缓存脚印和缓存错误的代码。DRAM/DDR的缓存行大小为16字节。如果平台的内存控制器具有更宽的数据总线,并且并行地访问多个内存模块,则它可以更大(32或64字节)。同样的逻辑(对于页面对齐)也适用于这里:如果将通常作为一个组访问的结构字段放在一起,按照缓存行大小对齐,则可以大大减少数据的缓存占用。最简单的例子是std::map< struct aaa *, void * >。如果struct aaa包含大量字段,为了最小化缓存占用,将用于比较的所有字段(键字段)放在结构的开头。如果关键字段分布在结构上,则在最坏的情况下,每个键字段都会碰到缓存行。如果在结构开始时将关键字段组合在一起,那么比较可能会接触到更少的缓存行。较少的缓存行数据需要,更多的缓存留给应用程序的其余部分。缓存行大小通常不适用于应用程序,尽管利用各种伎俩可以找到它。

我刷了很多小细节,以保持相对较短。如果你想知道更多关于它,然后阅读一些CPU手册是建议。英特尔有相当好的开发人员手册

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3370347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档