问题标签 [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.
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 方法:
c++ - 浮点编译时计算没有发生?
一个小测试程序:
结果 :
在 Visual Studio 2008 和 2010 上测试。
- 我曾在其他编译器上工作过,如果我没记错的话,第一个结果就像第二个结果一样。现在我的记忆可能是错误的,但 TEST_FLOAT 的值不应该与 TEST_C 相同吗?如果不是,为什么?
- TEST_C 值是在编译时还是在运行时解析的?我总是假设前者,但现在我看到这些结果我有些怀疑......
c - 在 C 中控制对内存映射寄存器的读写访问宽度
我正在使用基于 x86 的内核来操作 32 位内存映射寄存器。仅当 CPU 生成 32 位宽的读取和写入此寄存器时,我的硬件才能正常运行。该寄存器在 32 位地址上对齐,不能以字节粒度寻址。
我可以做些什么来保证我的 C(或 C99)编译器在所有情况下都只会生成完整的 32 位宽的读取和写入?
例如,如果我执行如下读取-修改-写入操作:
我不希望编译器对只有底部字节更改并生成 8 位宽读/写的事实变得聪明。由于 x86 上 8 位操作的机器代码通常更密集,我担心不需要的优化。通常禁用优化不是一种选择。
----- 编辑 -------
一篇有趣且非常相关的论文:http ://www.cs.utah.edu/~regehr/papers/emsoft08-preprint.pdf
c++ - /fp:fast 的奇怪结果
我们有一些看起来像这样的代码:
不幸的是,当使用 flag 时/fp:fast
,我们得到了,calc_something(0)==1
所以我们显然采用了错误的代码路径。这只发生在我们在代码中的多个点使用不同参数的方法时,所以我认为编译器(Microsoft Visual Studio 2008,SP1)在这里进行了一些可疑的优化。
此外,当我们将界面更改为
但我不知道为什么这会解决奇怪的行为。任何人都可以解释这种行为吗?如果我无法理解发生了什么,我们将不得不移除/fp:fast
开关,但这会使我们的应用程序变得相当慢。
compilation - C++ 优化
我们可以在 c++ 中看到优化的代码............(不是汇编)吗?
optimization - __assume 的一些示例导致在 switch 中除了“无默认值”之外的更快的代码?
__assume 的文档说“__assume 最常见的用法是使用 switch 语句的默认情况,如下例所示。”。
- 是否有任何其他情况 __assume 可以导致更有效(甚至不同)的代码?
- 在 if / else 内部时,编译器是否会自动“假设”由于 if 条件而已经知道的内容?
我找不到任何可以显示上述任何内容的重要示例-我希望其他人可以。
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++ 版本相同的结果。
c++ - Visual C++ 2008/2010 编译器的优化程度如何?
我只是想知道 MSVC++ 编译器如何优化代码(带有代码示例)或者他不能优化什么以及为什么。
例如,我使用了类似这样的 SSE-intrinsics(var 是一个 __m128 值)(它用于截头体剔除测试):
当我查看 asm 输出时,我看到它确实编译成一个丑陋的非常跳跃的版本(而且我知道 CPU 只是讨厌快速跳跃)而且我也知道我可以使用 SSE4.1 PTEST 指令对其进行优化,但是为什么编译器不这样做(即使编译器编写者定义了 PTEST 内在函数,所以他们知道指令)?
它也不能做哪些优化(直到现在)。
这是否意味着我使用当今的技术被迫使用内在函数和内联 ASM 以及链接的 ASM 函数,并且编译器会找到这样的东西(我不这么认为)?
我在哪里可以阅读更多关于 MSVC++ 编译器优化的信息?
(编辑 1): 我使用了 SSE2 开关和 FP:fast 开关
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 文件
我用来读取文件的代码如下所示:
谁能帮我?这让我发疯:(