如何在 C 中使用 __builtin_assume_aligned

ele*_*ora 4 c

在我的 C 代码中,我有

complex float M[n][n];
complex float *delta = malloc(n * sizeof *delta);
complex float *v = malloc(n * sizeof *v);
for (i = 0; i < n; i++) {
    v[i] -= 2.*delta[j]*M[j][i];
}
Run Code Online (Sandbox Code Playgroud)

哪里in是整数。

有人建议我使用__builtin_assume_aligned确保这些对齐以帮助自动矢量化。但是,查看了文档后,我不明白该怎么做。

您将如何将它用于此代码?


本题代码摘自How to help gcc vectorize C code。这也是我想尝试调整事物的原因。

tzo*_*zot 6

__builtin_assume_aligned只是gcc指针已经对齐的提示,因此它通常可以对以下代码进行矢量化;它不是对任何一个malloc或任何其他内存分配机制的指令,所以你可能在撒谎gcc

为确保您实际对齐指针,您有责任使用适当的机制。所以你必须:

  • 要么malloc然后四舍五入到您的粒度的下一个倍数(如果还没有)
  • __attribute__((aligned(N)))在您的声明中使用(确保适用于堆分配,也可能适用于堆栈分配的变量)
  • 或使用对齐内存分配调用,如 posix_memalign