获取处理器的内存粒度

问题描述 投票:1回答:2

如何在C语言中获取CPU的内存粒度?

假设我要分配一个数组,其中所有元素都正确地进行了内存对齐。我可以将每个元素填充到一定的大小N以实现此目的。我怎么知道N的值?

c memory-management memory-alignment granularity
2个回答
1
投票

理论上

如何在C语言中获取CPU的内存粒度?

首先,您阅读了指令集体系结构手册。它可以指定某些指令需要某些对齐方式,或者甚至某些指令中的寻址形式甚至不能表示未对齐的地址。它可以指定有关对齐的其他属性。

第二,您阅读了处理器手册。它可以指定性能特征(例如,支持未对齐的负载或存储,但是比对齐的负载或存储可能更慢或使用更多的资源),并且可以指定指令集体系结构允许的各种选项。

第三,您阅读了操作系统文档。一些体系结构允许操作系统选择与对齐有关的功能,例如是否使未对齐的负载和存储失败或受支持,尽管其性能比对齐的负载或存储要慢。操作系统文档应具有此信息。

实践中

对于许多编程情况,您需要了解的不是CPU的“内存粒度”,而是您所使用的C实现(或所使用的任何语言)的对齐要求。而且,在大多数情况下,您不需要直接了解对齐要求,而只需遵循有关管理对象的语言规则-使用具有声明类型的对象,不使用强制转换在不兼容类型之间转换指针,超出特定规则允许的范围使用malloc提供的适当对齐的内存,而不要调整自己的字节指针,依此类推。遵循这些规则将使程序中的对象保持良好的对齐。

在C中,定义数组时,元素大小将自动为C实现对齐所需的大小。例如,即使硬件仅为long double x[100];使用十个字节,long double可能为每个数组元素使用16个字节。或者,对于您定义的任何struct foo,编译器将根据需要在结构中自动包含填充以提供所需的对齐方式,并且任何数组struct foo x[100];都将已经包含该填充。 sizeof(struct foo)将与sizeof x[0]相同,因为每个结构对象都内置了填充,即使是仅针对单个结构对象,也不只是针对数组中的元素。

[当您确实需要了解C实现对类型的对齐方式时,可以使用C的_Alignof运算符。表达式_Alignof(type)提供type所需的对齐方式。

其他

…正确对齐内存。

正确对齐是度的问题:

  • 处理器支持什么,可能会确定您的程序是否有效。对齐不当会导致程序陷入陷阱。
  • 关于单个加载和存储的有效方式可能会影响程序的运行速度。不正确的对齐会使程序执行得更慢。
  • 在某些对性能有严格要求的情况下,有关缓存和内存映射功能的对齐也会影响性能。

0
投票

这在很大程度上取决于您使用的cpu微体系结构。

[在许多情况下,运算符的内存地址应为操作数大小的倍数,否则执行速度会很慢(甚至可能引发异常)。

但是也有一些CPU根本不关心内存中操作数的特定对齐方式。

通常,C编译器会为您关心这些细节。但是,您应该确保编译器采用正确的目标(微)体系结构,例如,通过使用正确的编译器标志(在gcc上为-march=?)进行指定。

© www.soinside.com 2019 - 2024. All rights reserved.