如何在C语言中使用__builtin_assume_aligned

7

在我的 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];
}

其中in是整数。

建议使用__builtin_assume_aligned来确保它们对齐,以帮助自动向量化。但是,查看文档后我不知道如何做到这一点。

您会如何在此代码中使用它?


这个问题中的代码是从如何帮助gcc向量化C代码中提取的。这也是我想尝试对齐的原因。


假设这是伪代码,并且在真正的代码中,您会在使用它们之前初始化Mdeltav吗? - Some programmer dude
@Someprogrammerdude 是的,绝对可以。这个问题来自于https://dev59.com/WZ7ha4cB1Zd3GeqPfS_5。 - Simd
1个回答

8
__builtin_assume_aligned是一个提示,告诉gcc指针已经对齐,以便它通常可以矢量化以下代码; 它不是针对malloc或任何其他内存分配机制的指令,因此你可能在欺骗gcc
为确保您实际上已经对齐了指针,您需要使用适当的机制。所以你必须:
  • 要么使用malloc,然后将其舍入到下一个倍数的粒度(如果还没有到达)
  • 或者在声明中使用__attribute__((aligned(N)))(对于堆分配的变量肯定有效,对于栈分配的变量可能有效)
  • 或者使用像posix_memalign这样的对齐内存分配调用

1
“__builtin_assume_aligned”只是一个提示。-- 我认为称其为“提示”是错误的。它是一种承诺。 - MWB
我认为“提示”这个词在“编译提示”中是相当常见的用法,但如果我错了,你的评论将帮助其他人消除歧义。感谢您的反馈! - tzot
1
有编译器提示,比如__builtin_expect。这就是为什么它是常见用法。但并不是所有东西都是提示。 - MWB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接