compiler-optimization 相关问题

编译器优化涉及调整编译器以减少运行时或对象大小或两者。这可以使用编译器参数(即CFLAGS,LDFLAGS),编译器插件(例如DEHYDRA)或对编译器的直接修改(例如修改源代码)来实现。

如何在使用输入数据时实现 FMA 的峰值触发器吞吐量(同时保持所需的屋顶线计算/负载比)?

我尝试在加载输入数据时实现 SIMD FMA 计算的峰值浮点吞吐量。我加载相对计算/内存加载速度允许的尽可能多的数据。我还应用了缓冲来避免

回答 1 投票 0

C 编译器或预处理器如何以不同方式处理带参数的宏?

我正在为 Atmel 微控制器编写代码并使用 ATMEL Studio。 您可以从此处检查工具链和工作室版本。 *\Atmel\Studio .0 oolchain vr8 vr8-gnu-toolchain\lib\gcc vr ...

回答 1 投票 0

如何让 LLVM 选择输出 MIR 并传递给 llc?

我需要将 MIR 文件传递给 LLC,以便我可以使用 -run-pass 选项,但我找不到有关从 opt 输出为 MIR 的任何信息。我怎样才能做到这一点?

回答 1 投票 0

为什么这个编译器优化只发生在main之外?

我有以下 C 函数,它将两个无符号短整型相乘并将结果存储为无符号整数。然后,该函数打印结果值是否具有最大显着性...

回答 1 投票 0

编译器会知道跳过这个循环吗?

我正在探索 C++ 与其他语言(例如 Python)相比的速度。 以下代码计数到 1 亿并打印出最终数字(1 亿)。 我想知道编译器是否...

回答 1 投票 0

C long int 总是以大端方式访问内存?

在一个未回答的老问题的评论讨论中,一位用户声称 C long int 类型“以大端模式访问内存”。 我事先为我的不足表示歉意

回答 1 投票 0

在函数参数中计算 C 表达式是否违反了 MISRA C 准则?

现在考虑一下在安全关键嵌入式软件中执行的以下代码段,其中 gcc_optimization_level 的大小为 Level2。说一个函数,void foo(float v);被调用为 f...

回答 1 投票 0

我可以告诉 QB64 编译器*不*优化我的代码吗?

我想实验各种算法的效率,而编译器优化是一个障碍。我可以在 QB64 中禁用编译器优化吗?

回答 1 投票 0

-O 和 -wrap 的行为

我正在尝试使用 -wrap=symbol 来模拟函数进行单元测试,并且根据传递的 GCC 优化标志发现不同的行为 考虑下面的示例程序 #包括 我正在尝试使用 -wrap=symbol 来模拟函数进行单元测试,并且根据传递的 GCC 优化标志发现不同的行为 考虑下面的示例程序 #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <assert.h> void * __wrap_malloc(size_t sz) { printf("Called %s", __func__); return (void *) 0xDEADBEEF; } int main() { void *ptr; ptr = malloc(10); assert(0xDEADBEEF == (unsigned int)(uintptr_t)(ptr)); return 0; } 使用优化时 ❯ gcc -Os -Wl,-wrap=malloc 1.c -o opt ❯ ./opt opt: 1.c:16: main: Assertion `0xDEADBEEF == (unsigned int)(uintptr_t)(ptr)' failed. [1] 12546 abort ./opt 未经优化 ❯ gcc -Wl,-wrap=malloc 1.c -o without_opt ❯ ./without_opt Called __wrap_malloc 我尝试反汇编可执行文件 优化 0000000000400450 <main>: 400450: 48 83 ec 08 sub $0x8,%rsp 400454: b9 20 06 40 00 mov $0x400620,%ecx 400459: ba 10 00 00 00 mov $0x10,%edx 40045e: be ea 05 40 00 mov $0x4005ea,%esi 400463: bf ee 05 40 00 mov $0x4005ee,%edi 400468: e8 d3 ff ff ff callq 400440 <__assert_fail@plt> 40046d: 0f 1f 00 nopl (%rax) 未经优化 000000000040053e <main>: 40053e: 55 push %rbp 40053f: 48 89 e5 mov %rsp,%rbp 400542: 48 83 ec 10 sub $0x10,%rsp 400546: bf 0a 00 00 00 mov $0xa,%edi 40054b: e8 c7 ff ff ff callq 400517 <__wrap_malloc> 400550: 48 89 45 f8 mov %rax,-0x8(%rbp) 400554: 48 8b 45 f8 mov -0x8(%rbp),%rax 400558: 3d ef be ad de cmp $0xdeadbeef,%eax 40055d: 74 19 je 400578 <main+0x3a> 40055f: b9 4e 06 40 00 mov $0x40064e,%ecx 400564: ba 10 00 00 00 mov $0x10,%edx 400569: be 0a 06 40 00 mov $0x40060a,%esi 40056e: bf 10 06 40 00 mov $0x400610,%edi 400573: e8 c8 fe ff ff callq 400440 <__assert_fail@plt> 400578: b8 00 00 00 00 mov $0x0,%eax 40057d: c9 leaveq 40057e: c3 retq 40057f: 90 nop 没有调用wrap_malloc。看起来已经优化了。然后我尝试添加打印语句 int main() { void *ptr; ptr = malloc(10); >> printf("0x%x\n", (uintptr_t)ptr); assert(0xDEADBEEF == (unsigned int)(uintptr_t)(ptr)); return 0; } ❯ gcc -Os -Wl,-wrap=malloc 1.c -o print_opt ❯ ./print_opt Called __wrap_malloc0xdeadbeef print_opt: 1.c:17: main: Assertion `0xDEADBEEF == (unsigned int)(uintptr_t)(ptr)' failed. [1] 31575 abort ./print_opt 现在我看到包装的函数被调用。但断言失败了 0000000000400450 <main>: 400450: 48 83 ec 08 sub $0x8,%rsp 400454: bf 0a 00 00 00 mov $0xa,%edi 400459: e8 f9 00 00 00 callq 400557 <__wrap_malloc> 40045e: bf 0a 06 40 00 mov $0x40060a,%edi 400463: 48 89 c6 mov %rax,%rsi 400466: 31 c0 xor %eax,%eax 400468: e8 c3 ff ff ff callq 400430 <printf@plt> 40046d: b9 48 06 40 00 mov $0x400648,%ecx 400472: ba 11 00 00 00 mov $0x11,%edx 400477: be 10 06 40 00 mov $0x400610,%esi 40047c: bf 14 06 40 00 mov $0x400614,%edi 400481: e8 ba ff ff ff callq 400440 <__assert_fail@plt> 400486: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 40048d: 00 00 00 有人可以帮助我理解为什么/如何看到这种行为吗?预先感谢 对于 gcc,malloc() 被视为所谓的 “内置”函数,优化器会意识到并专门处理它(例如,它可以对其返回值做出某些假设,这会导致它自动失败)断言而不需要对其进行运行时测试)。如果您将 -fno-builtin-malloc 添加到编译选项中,则该特殊处理将被禁用: $ gcc -Os -fno-builtin-malloc -Wl,-wrap=malloc 1.c -o opt $ ./opt Called __wrap_malloc

回答 1 投票 0

[[假设]] 属性对代码没有影响

我希望下面的multiply_by_pow_of_2函数有一个更优化的乘法代码,因为我使用了[[假设(std::has_single_bit(multiplier))]];这应该告诉

回答 1 投票 0

C++ 中使用 std::vector 进行转义分析

我想知道 Clang 或 GCC 中是否有任何优化选项可用于对 C++ 中的 std::vector 进行转义分析。 由于下面示例中的 std::vector 不需要 v 的实际数据...

回答 2 投票 0

Twincat 3 / Codesys / PLC 代码优化(进行 OOP 时)

我从 PLC 编程开始,特别是使用 Beckhoff Twincat 3,我拥有 C/C++ 嵌入式编程背景和一些用于跨平台开发的 C# 背景。 我发现了

回答 1 投票 0

实现闭包和性能影响,例如相对与绝对跳跃

不久前,我在编译器类中学习了闭包转换,并且想知道调用闭包与调用函数会产生多少性能开销。 考虑一个函数

回答 1 投票 0

相对跳跃与绝对跳跃的表现

不久前,我在编译器类中学习了闭包转换,并且想知道调用闭包与调用函数会产生多少性能开销。 考虑一个函数

回答 1 投票 0

为什么这个程序在Linux上比在Windows上慢很多?

我尝试在 Linux 上运行这段代码,但我发现它在 Linux 上的运行速度比在 Windows 上慢 2 倍到 3 倍。使用其官方输入示例 data/BS_1000_torus.xyz,在 Windows 上需要大约 20 秒,但在 Linux 上......

回答 1 投票 0

我应该使用哪个选项来设置 CMake 中的编译器选项?

我注意到似乎有两种方法可以在 CMake 文件中设置编译器选项: target_compile_options(${TargetName} PRIVATE "-O3") 或者 设置(CMAKE_CXX_FLAGS“${CMAKE_CXX_FLAGS} -O3&qu...

回答 1 投票 0

Lua 在发出字节码时如何利用 <const>?

我正在摆弄 Lua 并使用 https://www.luac.nl/ 来看看它如何转换为字节码。我想看看是否有类似 if boolean_always_true then ... end 的模式,布尔值是用 <...

回答 1 投票 0

应用程序未在发布模式下进入 Posix 信号处理程序

我正在尝试在 Linux Arm 设备上正常关闭我的控制台应用程序。发送的信号是 SIGTERM。我使用新的 PosixSignalRegistration.Create() 实现了 Posix Sgnal Handler

回答 1 投票 0

为什么 GCC 和 Clang 会在两个分支上弹出而不是只弹出一次?

GCC 和 Clang 都可以编译 布尔预测(); 无效 f(); 无效 g(); 无效 h() { 如果(预测()){ F(); } 别的 { G(); } } 到一些变化 # Clang -Os 输出。 -O3是一样的 哈...

回答 1 投票 0

我应该使用哪些 gcc 优化标志?

如果我想最小化我的C程序运行时间,我应该使用什么优化标志(我也想保持标准) 目前我正在使用: -墙 -Wextra -迂腐 -ansi -O3 我也应该使用...

回答 3 投票 0

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