如标题,我知道 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 属性。
#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_unroll_hint
属性。其含义记录在
OpenCL C 2.0 规范文档:
6.11.5。指定展开循环的属性
和__attribute__((opencl_unroll_hint))
属性限定符可以是 用于指定可以展开循环(for、while 和 do 循环)。 该属性限定符可用于指定完全展开或 按指定数量部分展开。这是编译器提示 编译器可能会忽略该指令。__attribute__((opencl_unroll_hint(n)))
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
,但可能就足够了,具体取决于预期用途。