clang有函数属性:像gcc一样展开循环吗?

问题描述 投票:0回答:1

如标题,我知道 clang 有声明属性

#pragma clang loop unroll(enable)

https://clang.llvm.org/docs/LanguageExtensions.html#extensions-for-loop-hint-optimizations

海湾合作委员会就像

__attribute__((optimize("unroll-loops")))

但在 clang 中未找到 function level 属性。

clang llvm
1个回答
0
投票

主要 clang 循环提示?没有。

Clang 接受循环提示的主要方式是通过

#pragma clang loop
family,并且这些没有等效的属性(从 Clang 16 开始)。 链接的文档有一个“支持的语法”表,即 多列表,唯一填充的列是 编译指示。

这也可以在源代码中观察到,位于 属性.td:3654, 唯一的“拼写”是杂注:

  let Spellings = [Pragma<"clang", "loop">, Pragma<"", "unroll">,
                   Pragma<"", "nounroll">, Pragma<"", "unroll_and_jam">,
                   Pragma<"", "nounroll_and_jam">];

OpenCL 循环提示?是的。

Clang 也接受

opencl_unroll_hint
属性。其含义记录在 OpenCL C 2.0 规范文档

6.11.5。指定展开循环的属性

__attribute__((opencl_unroll_hint))
__attribute__((opencl_unroll_hint(n)))
属性限定符可以是 用于指定可以展开循环(for、while 和 do 循环)。 该属性限定符可用于指定完全展开或 按指定数量部分展开。这是编译器提示 编译器可能会忽略该指令。

n 是循环展开因子,必须是正整数编译 时间常数表达式。展开因子为 1 将禁用展开。如果 n 未指定,编译器确定展开因子 循环。

尽管名称中有“OpenCL”,但它的工作原理一般。例如, 该函数中的循环:

void my_strcpy(char *d, char const *s)
{
    __attribute__((opencl_unroll_hint(4)))
    while (*s != 0) {
        *(d++) = *(s++);
    }
    *d = 0;
}
当目标为 x86_64 时,

将被 Clang-16 使用

-O2
展开四次 (神箭).

这些提示不如可用的主要 clang 循环提示那么强大 通过

#pragma
,但可能就足够了,具体取决于预期用途。

© www.soinside.com 2019 - 2024. All rights reserved.