c++ - GCC 忽略 -funroll-loop 参数
问题描述
GCC 只是忽略-funroll-loops
和-funroll-all-loops
选项。
#include <stdio.h>
void NOT_WORK_1(char* arg)
{
for(int i = 0; i < 4; ++i) {
printf("%s", arg);
}
}
__attribute__((optimize("unroll-loops")))
void NOT_WORK_2(char* arg)
{
for(int i = 0; i < 4; ++i) {
printf("%s", arg);
}
}
#pragma GCC push_options
#pragma GCC optimize ("unroll-loops")
void NOT_WORK_3(char* arg)
{
for(int i = 0; i < 4; ++i) {
printf("%s", arg);
}
}
#pragma GCC pop_options
void WORKS_1(char* arg)
{
#pragma GCC unroll(4)
for(int i = 0; i < 4; ++i) {
printf("%s", arg);
}
}
编译的屁股gcc -O3 -funroll-loops
。ASM 输出
.LC0:
.string "%s"
NOT_WORK_1:
push rbp
mov rbp, rdi
push rbx
mov ebx, 4
sub rsp, 8
.L2:
xor eax, eax
mov rsi, rbp
mov edi, OFFSET FLAT:.LC0
call printf
sub ebx, 1
jne .L2
add rsp, 8
pop rbx
pop rbp
ret
NOT_WORK_2:
push rbp
mov rbp, rdi
push rbx
mov ebx, 4
sub rsp, 8
.L7:
xor eax, eax
mov rsi, rbp
mov edi, OFFSET FLAT:.LC0
call printf
sub ebx, 1
jne .L7
add rsp, 8
pop rbx
pop rbp
ret
NOT_WORK_3:
push rbp
mov rbp, rdi
push rbx
mov ebx, 4
sub rsp, 8
.L11:
xor eax, eax
mov rsi, rbp
mov edi, OFFSET FLAT:.LC0
call printf
sub ebx, 1
jne .L11
add rsp, 8
pop rbx
pop rbp
ret
WORKS_1:
push rbp
mov rsi, rdi
mov rbp, rdi
xor eax, eax
mov edi, OFFSET FLAT:.LC0
call printf
mov rsi, rbp
mov edi, OFFSET FLAT:.LC0
xor eax, eax
call printf
mov rsi, rbp
mov edi, OFFSET FLAT:.LC0
xor eax, eax
call printf
mov rsi, rbp
mov edi, OFFSET FLAT:.LC0
xor eax, eax
pop rbp
jmp printf
如果您查看代码,您会发现我已经尝试过:
- 在编译期间通过命令行参数传递“-funroll-loops”
- 使用
#pragma GCC optimize ("unroll-loops")
- 使用
__attribute__((optimize("unroll-loops")))
GCC 有特殊的pragma,但它仅适用于 GCC >= 8,但我必须使用 GCC 7.5.0 编译,其中不可用。有什么方法可以强制旧的 GCC 表现得像 GCC 一样#pragma GCC unroll N
?
解决方案
推荐阅读
- python - 创建实例后更改基类 (__bases__)。isinstance() 操作。蟒蛇 2.7
- javascript - 试图在第三方网站上仅勾选包含 Javascript/jQuery 中某些选择器的复选框
- apache - 流浪域 ERR_CONNECTION_REFUSED
- python - Pydoop mapreduce“AttributeError:模块'wordcount_minimal'没有属性'__main__'”
- .htaccess - 如何忽略 Htaccess 中 url 参数字符串的结尾?
- php - php fileinfo文件上传验证不起作用
- php - Magento 2在Minicart(DropdownDialog)打开时禁用浏览器滚动?
- c# - 将日期时间设置为晚上 11:59:59
- css - 与现代 CSS 兼容的 Maven 的 CSS 缩小器
- javascript - Javascript 在 DOM 中查找给定 div 及其内容的出现