typedef with restrict keyword

时间:2017-04-26 10:06:26

标签: c gcc clang typedef

我定义了像这样的对齐浮点数

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,我需要对齐。

0 个答案:

没有答案