问题标签 [compiler-optimization]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
7 回答
22091 浏览

bitwise-operators - 是否可以使用整数算术实现位运算符?

我面临一个相当特殊的问题。我正在为不支持按位运算的架构开发编译器。但是,它处理有符号的 16 位整数运算,我想知道是否可以仅使用以下方法实现按位运算:

  • 加法( c = a + b )
  • 减法( c = a - b )
  • 除法( c = a / b )
  • 乘法( c = a * b )
  • 模数( c = a % b )
  • 最小值( c = min(a, b) )
  • 最大值( c = max(a, b) )
  • 比较c =(a < b),c =(a == b),c =(a <= b)等
  • 跳转goto、for 等

我希望能够支持的按位运算是:

  • ( c = a | b )
  • ( c = a & b )
  • 异或( c = a ^ b )
  • 左移( c = a << b )
  • 右移( c = a >> b )
  • (所有整数都有符号,所以这是一个问题)
  • 有符号移位( c = a >>> b )
  • 一个的补码( a = ~b )
  • (已经找到解决方案,见下文)

通常问题是相反的。如何使用按位 hack 实现算术优化。但是在这种情况下不是。

这种架构上的可写内存非常稀缺,因此需要按位运算。按位函数本身不应使用大量临时变量。但是,常量只读数据和指令内存是丰富的。附带说明一下,跳转和分支并不昂贵,并且所有数据都可以轻松缓存。跳转花费的周期是算术(包括加载/存储)指令的一半。换句话说,所有上述支持的功能都花费了单次跳转周期的两倍。


一些可能有帮助的想法:

我发现您可以使用以下代码进行补码(否定位):

我还记得用 2 的幂除时的旧移​​位技巧,因此按位移位可以表示为:

对于其余的按位运算,我有点不知所措。我希望这种架构的架构师能够提供位操作。

我还想知道是否有一种快速/简单的方法可以在不使用内存数据表的情况下计算两个的幂(用于移位操作)。一个天真的解决方案是跳入乘法领域:

或 Set & Jump 方法:

0 投票
1 回答
273 浏览

c++ - 浮点编译时计算没有发生?

一个小测试程序:

结果 :

在 Visual Studio 2008 和 2010 上测试。

  1. 我曾在其他编译器上工作过,如果我没记错的话,第一个结果就像第二个结果一样。现在我的记忆可能是错误的,但 TEST_FLOAT 的值不应该与 TEST_C 相同吗?如果不是,为什么?
  2. TEST_C 值是在编译时还是在运行时解析的?我总是假设前者,但现在我看到这些结果我有些怀疑......
0 投票
5 回答
1542 浏览

c - 在 C 中控制对内存映射寄存器的读写访问宽度

我正在使用基于 x86 的内核来操作 32 位内存映射寄存器。仅当 CPU 生成 32 位宽的读取和写入此寄存器时,我的硬件才能正常运行。该寄存器在 32 位地址上对齐,不能以字节粒度寻址。

我可以做些什么来保证我的 C(或 C99)编译器在所有情况下都只会生成完整的 32 位宽的读取和写入?

例如,如果我执行如下读取-修改-写入操作:

我不希望编译器对只有底部字节更改并生成 8 位宽读/写的事实变得聪明。由于 x86 上 8 位操作的机器代码通常更密集,我担心不需要的优化。通常禁用优化不是一种选择。

----- 编辑 -------
一篇有趣且非常相关的论文:http ://www.cs.utah.edu/~regehr/papers/emsoft08-preprint.pdf

0 投票
5 回答
982 浏览

c++ - /fp:fast 的奇怪结果

我们有一些看起来像这样的代码:

不幸的是,当使用 flag 时/fp:fast,我们得到了,calc_something(0)==1所以我们显然采用了错误的代码路径。这只发生在我们在代码中的多个点使用不同参数的方法时,所以我认为编译器(Microsoft Visual Studio 2008,SP1)在这里进行了一些可疑的优化。

此外,当我们将界面更改为

但我不知道为什么这会解决奇怪的行为。任何人都可以解释这种行为吗?如果我无法理解发生了什么,我们将不得不移除/fp:fast开关,但这会使我们的应用程序变得相当慢。

0 投票
2 回答
219 浏览

compilation - C++ 优化

我们可以在 c++ 中看到优化的代码............(不是汇编)吗?

0 投票
1 回答
1983 浏览

optimization - __assume 的一些示例导致在 switch 中除了“无默认值”之外的更快的代码?

__assume 的文档说“__assume 最常见的用法是使用 switch 语句的默认情况,如下例所示。”。

  • 是否有任何其他情况 __assume 可以导致更有效(甚至不同)的代码?
  • 在 if / else 内部时,编译器是否会自动“假设”由于 if 条件而已经知道的内容?

我找不到任何可以显示上述任何内容的重要示例-我希望其他人可以。

0 投票
3 回答
4360 浏览

c# - 在哪里可以修改 Visual Studio 中详细的 C# 编译器优化设置?

在 Visual Studio C/C++ 项目中,很容易在“属性页 | C/C++ | 优化”中修改编译器的优化设置。例如,我们可能会给出不同的优化级别如 /O2 和 /O3,以及高级优化如“省略帧指针”。

但是,我不能简单地在 Visual Studio 的 C# 项目中找到相应的 UI。我能找到的只是关闭优化:“优化代码”复选框就是我所拥有的。

C# 用户可以像 C/C++ 一样控制详细的编译器优化吗?我必须在命令行中提供编译器选项吗?

替代文字

0 投票
5 回答
6175 浏览

c++ - 是否有 (Linux) g++ 等效于 Visual Studio 中使用的 /fp:precise 和 /fp:fast 标志?

背景:

许多年前,我继承了一个代码库,它使用 Visual Studio (VC++) 标志“/fp:fast”在特定计算量大的库中生成更快的代码。不幸的是,'/fp:fast' 产生的结果与不同编译器 (Borland C++) 下的同一个库略有不同。因为我们需要产生完全相同的结果,所以我切换到“/fp:precise”,它工作得很好,从那以后一切都很顺利。但是,现在我在 uBuntu Linux 10.04 上使用 g++ 编译同一个库,我看到了类似的行为,我想知道它是否可能有类似的根本原因。我的 g++ 构建的数值结果与我的 VC++ 构建的数值结果略有不同。这让我想到了我的问题:

问题:

g++ 是否具有与 VC++ 中的 'fp:fast' 和 'fp:precise' 选项等效或相似的参数?(它们是什么?我想激活 'fp:precise' 等效项。)

更多详细信息:

我使用'make'编译,它调用g++。据我所知(make 文件有点神秘,不是我写的)添加到 g++ 调用的唯一参数是“正常”参数(包括文件夹和要编译的文件)和 -fPIC(我不确定这个开关的作用,我在“手册”页上看不到它)。

'man g++' 中唯一相关的参数似乎是用于打开优化选项。(例如 -funsafe-math-optimizations)。但是,我不认为我在打开任何东西,我只是想关闭相关的优化。

我尝试过发布和调试版本,VC++ 为发布和调试提供了相同的结果,而 g++ 为发布和调试提供了相同的结果,但我无法让 g++ 版本给出与 VC++ 版本相同的结果。

0 投票
5 回答
2007 浏览

c++ - Visual C++ 2008/2010 编译器的优化程度如何?

我只是想知道 MSVC++ 编译器如何优化代码(带有代码示例)或者他不能优化什么以及为什么。

例如,我使用了类似这样的 SSE-intrinsics(var 是一个 __m128 值)(它用于截头体剔除测试):

当我查看 asm 输出时,我看到它确实编译成一个丑陋的非常跳跃的版本(而且我知道 CPU 只是讨厌快速跳跃)而且我也知道我可以使用 SSE4.1 PTEST 指令对其进行优化,但是为什么编译器不这样做(即使编译器编写者定义了 PTEST 内在函数,所以他们知道指令)?

它也不能做哪些优化(直到现在)。

这是否意味着我使用当今的技术被迫使用内在函数和内联 ASM 以及链接的 ASM 函数,并且编译器会找到这样的东西(我不这么认为)?

我在哪里可以阅读更多关于 MSVC++ 编译器优化的信息?

(编辑 1): 我使用了 SSE2 开关和 FP:fast 开关

0 投票
1 回答
2830 浏览

c - Visual Studio 2008 不对齐堆栈变量?

我正在尝试以 OpenCV 2.1、VS2008 标准读取 avi 文件 2 天,但没有运气。我经常在程序控制台中收到此消息:

编译器未对齐堆栈变量。Libavcodec 已被错误编译,可能非常缓慢或崩溃。这不是 libavcodec 中的错误,而是编译器中的错误。您可以尝试使用 gcc >= 4.2 重新编译。不要向 FFmpeg 开发人员报告崩溃。

..我得到的帧速率是 0.5fps 播放。我尝试了各种 AVI 和 MPEG 文件,结果仍然相同。此外,包含使用网络摄像头的示例非常慢。我在使用 OpenCV 1.1 时没有遇到这样的问题

我已经尝试解决此问题的事情:

  • 重新编译整个库
  • 从 SVN 更新库并重新编译
  • 尝试了各种版本的 libavcodec.a 文件

我用来读取文件的代码如下所示:

谁能帮我?这让我发疯:(