【发布时间】:2017-07-21 03:48:01
【问题描述】:
struct vec_struct {
alias field this;
bool b;
int8 field; // ymm
}
在这段代码中,当您查看 GDC 生成的 x64 代码输出时,它似乎做得很好,因为它为 256 位 YMM '字段' 正确设置了偏移量。
Q:D 是否会自动将字段的对齐限制传播到静态结构或堆栈上的结构的分配?
在这种情况下-
struct vec_struct {
bool b2;
struct {
alias field this;
bool b;
int8 field; // umm
}
}
“字段”的偏移量似乎不再正确对齐 - GDC 中的偏移量为 40 个字节。我不认为编译器将仅使用未对齐的指令?无论如何,如果我了解 D 文档,我可以获取字段地址,然后将其传递给期望获取具有保证正确对齐的东西的人。 问:这是正确的 - 一个非常糟糕的问题,还是我很愚蠢?
请不要咬人。我对 D 来说都是新手,我希望我已经理解 x86 SIMD 指令的文档。 (非常有经验的专业 asm 和 C 程序员,但是已经过时了。)
Noob q:我注意到 GDC 操作码看起来有点奇怪,例如编译器生成一个 256 位未对齐的 fetch,然后是对齐的二进制操作(我认为),例如 movdqu 后跟 vpaddd r, ymm ptr等等 - 后者是仅对齐的吗?抱歉,如果我错了,需要阅读。 有人会好心地检查我吗?
【问题讨论】:
-
像 vpaddd 这样的大多数操作(我没有特别检查那个)接受未对齐的内存操作数,它主要是 mov 具有严格对齐的变体。
-
感谢 Marc,我的无知 - 我假设太多了,所以除非我再看一遍,否则没有证据表明这是崩溃代码,因为我看到的(一些)动作是明确未对齐。尽管在子结构的对齐方式错误的情况下,它可能被认为是非常次优的,毕竟它通常会尝试正确对齐。
-
也可能是规范的要求有问题。如果强制要求与某些 C / C++ 编译器(哪个?)或某人的 ABI 规范兼容,那么如果对齐问题得到修复,可能会出现问题,但这当然意味着另一个“管理”规范首先被破坏地方,所以也许谁在乎,也许这不是一个有效的观点。
-
我想知道这是否是字段对齐限制不向外传播的一般问题,字段->(子)结构->包含结构->对象分配限制。肯定已经存在一种机制来确保正确完成这项工作吗?
标签: gcc struct d simd memory-alignment