【问题标题】:cache align elements of array缓存对齐数组的元素
【发布时间】:2017-05-24 17:27:49
【问题描述】:

有没有办法强制数组的每个元素缓存对齐,而不必在每个数组元素的末尾或类型本身添加填充?

如果我有:

struct foo {
    struct bar bar;
}; 

struct foo fooarray[100] __attribute__((aligned(CACHE_LINE_SIZE)));

这将声明一个数组 fooarray,其中数组本身是缓存对齐的,但各个元素不是(因此fooarray[1] 不在缓存行上)。该结构本身在数组之外使用,因此我不希望自动为其添加填充。同时,当我访问数组的元素时,我不想做任何额外的转换/取消引用......

【问题讨论】:

  • 你只关心gcc? (或者关于特定平台上的 gcc)?因为没有便携式方法可以做到这一点。
  • 我认为没有填充是不可能的。“自动”或“手动”。
  • 假设CACHE_LINE_SIZE 是已知的(我主要对 gcc 感兴趣,但总的来说很好奇......)
  • 好的。通常,不能保证您可以使用对齐声明来强制进行比最严格对齐的基本类型更严格的对齐。 GCC 允许更严格的对齐方式,但它们不可移植。如果您希望每个元素都对齐,请将元素声明为对齐,而不是容器。

标签: c arrays gcc


【解决方案1】:

有没有办法强制数组的每个元素缓存对齐,而不必在每个数组元素的末尾或类型本身添加填充?

不,没有。数组的表示被定义为其元素的一系列连续表示。您可以对齐数组的开头,因此对齐它的第一个元素,但如果数组有多个元素,并且元素大小不能被缓存行大小整除,那么某些元素必须无法缓存对齐。

【讨论】:

  • 好的,谢谢。我在输入问题时就想到了这一点,但我想无论如何我都会问,以防有什么我不知道的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多