有没有办法强制结构从缓存行开始?
Is there a way to force structure begins at cacheline?
我有一些大型结构(> 64 字节),我可以确保每个结构都从单独的缓存行开始吗?或者有什么方法可以强制执行吗?
假设gcc,你可以使用属性。
https://gcc.gnu.org/onlinedocs/gcc-3.3/gcc/Type-Attributes.html
“您可以明确指定您希望编译器用于给定结构或联合类型的对齐方式(以字节为单位)。或者,您可以省略对齐因子,只要求编译器将类型对齐到最大有用对齐方式您正在为其编译的目标机器。"
struct test {
int a;
double b;
void *n;
char p[59];
};
struct test_64 {
int a;
double b;
void *n;
char p[59];
} __attribute__ ((aligned (64)));
int main(void) {
struct test test_var __attribute__ ((aligned (64)));
struct test test_var_simple_align __attribute__ ((aligned));
printf ("sizeof (test):%ld ", sizeof(struct test));
printf ("__alignof__(test):%ld\n", __alignof__(struct test));
printf ("sizeof (test_64):%ld ", sizeof(struct test_64));
printf ("__alignof__(test_64):%ld\n", __alignof__(struct test_64));
printf ("sizeof (test_var):%ld ", sizeof(test_var));
printf ("__alignof__(test_var):%ld\n", __alignof__(test_var));
printf ("sizeof (test_var_simple_align):%ld ", sizeof(test_var_simple_align));
printf ("__alignof__(test_var_simple_align):%ld\n", __alignof__(test_var_simple_align));
return 0;
}
C标准提供了_Alignof (<i>constant-expression</i>)
请求额外对齐。对于结构,将其应用于第一个元素:
struct MyTag
{
_Alignas(64) char x[10];
};
#include <stdio.h>
int main(void)
{
printf("%zu\n", _Alignof (struct MyTag)); // Prints 64.
}
这要求您将缓存行大小作为编译时常量。
编译器不需要支持扩展对齐,但会诊断请求的对齐是否太大。
如果被编译器接受,这将为编译器分配的对象提供请求的对齐方式。但是,malloc
可能 return 地址未按预期对齐。为此,使用 struct MyTag *p = aligned_alloc(64, <i>size</i>);
,其中 <i>size</i>
对于一个结构是 sizeof *p
或者 <i>N</i> * sizeof *p
对于 <i>N</i>
结构.
我有一些大型结构(> 64 字节),我可以确保每个结构都从单独的缓存行开始吗?或者有什么方法可以强制执行吗?
假设gcc,你可以使用属性。
https://gcc.gnu.org/onlinedocs/gcc-3.3/gcc/Type-Attributes.html “您可以明确指定您希望编译器用于给定结构或联合类型的对齐方式(以字节为单位)。或者,您可以省略对齐因子,只要求编译器将类型对齐到最大有用对齐方式您正在为其编译的目标机器。"
struct test {
int a;
double b;
void *n;
char p[59];
};
struct test_64 {
int a;
double b;
void *n;
char p[59];
} __attribute__ ((aligned (64)));
int main(void) {
struct test test_var __attribute__ ((aligned (64)));
struct test test_var_simple_align __attribute__ ((aligned));
printf ("sizeof (test):%ld ", sizeof(struct test));
printf ("__alignof__(test):%ld\n", __alignof__(struct test));
printf ("sizeof (test_64):%ld ", sizeof(struct test_64));
printf ("__alignof__(test_64):%ld\n", __alignof__(struct test_64));
printf ("sizeof (test_var):%ld ", sizeof(test_var));
printf ("__alignof__(test_var):%ld\n", __alignof__(test_var));
printf ("sizeof (test_var_simple_align):%ld ", sizeof(test_var_simple_align));
printf ("__alignof__(test_var_simple_align):%ld\n", __alignof__(test_var_simple_align));
return 0;
}
C标准提供了_Alignof (<i>constant-expression</i>)
请求额外对齐。对于结构,将其应用于第一个元素:
struct MyTag
{
_Alignas(64) char x[10];
};
#include <stdio.h>
int main(void)
{
printf("%zu\n", _Alignof (struct MyTag)); // Prints 64.
}
这要求您将缓存行大小作为编译时常量。
编译器不需要支持扩展对齐,但会诊断请求的对齐是否太大。
如果被编译器接受,这将为编译器分配的对象提供请求的对齐方式。但是,malloc
可能 return 地址未按预期对齐。为此,使用 struct MyTag *p = aligned_alloc(64, <i>size</i>);
,其中 <i>size</i>
对于一个结构是 sizeof *p
或者 <i>N</i> * sizeof *p
对于 <i>N</i>
结构.