我定义了像这样的对齐浮点数
typedef __attribute((aligned(64))) float aligned_float;
然后我使用restrict
关键字定义对齐的浮点数,如此
typedef aligned_float * restrict aligned_floatptr;
这就像我期望的那样。但由于我几乎总是想要这两个在一起,所以我尝试将typedef放在一行中,就像这样
typedef __attribute((aligned(64))) float * restrict aligned_floatptr2
然而,这不起作用。 restrict
关键字仍然可以识别,但对齐不是。然而,编译器没有给我任何警告。我只是通过查看组件才意识到对齐不起作用。
为什么组合定义不起作用,为什么我没有收到警告?
您可以看到Clang和GCC here的程序集。
我想这样做的原因是我有这样的代码
static void kernel(float * restrict a, float * restrict b, float * restrict c, int n) {
a = __builtin_assume_aligned(a, 64);
b = __builtin_assume_aligned(b, 64);
c = __builtin_assume_aligned(c, 64);
//rest of code
}
我有很多变化。我觉得使用起来更方便
static void kernel(aligned_flotptr a, aligned_floatptr b, aligned_floatptr c, int n) {
//rest of code
}
我刚才意识到Clang似乎甚至没有认出aligned_float
。只有海湾合作委员会认可它。对于Clang,我仍然需要使用__builtin_assume_aligned
(或者#praga omp sind aligned
)。另一方面,Clang即使没有对齐也能产生良好的代码(未对齐的指令与几代的对齐版本一样快),所以我真的需要GCC,我需要对齐。