Tag: 编译器优化

我可以通过给出一个整数的范围来提示优化器吗?

我正在使用一个inttypes来存储一个值。 通过程序的语义,值总是在一个非常小的范围内变化(0-36), int (不是char )只是因为CPU的效率。 似乎很多特殊的算术优化可以在如此小范围的整数上执行。 对这些整数的许多函数调用可能被优化成一小组“神奇”的操作,并且一些函数甚至可以优化成查表。 那么,是否有可能告诉编译器这个int总是在这个小范围内,编译器是否有可能做这些优化?

C中的&&&操作是什么?

#include <stdio.h> volatile int i; int main() { int c; for (i = 0; i < 3; i++) { c = i &&& i; printf("%d\n", c); } return 0; } 上面的程序使用gcc编译的输出是 0 1 1 使用-Wall或-Waddress选项, gcc发出警告: warning: the address of 'i' will always evaluate as 'true' [-Waddress] 在上面的程序中如何评估c ?

将一个32位偏移量添加到x86-64 ABI的指针时,是否需要符号或零扩展?

简介:我正在查看汇编代码来指导我的优化,并将int32添加到指针时看到大量符号或零扩展。 void Test(int *out, int offset) { out[offset] = 1; } ————————————- movslq %esi, %rsi movl $1, (%rdi,%rsi,4) ret 起初,我认为我的编译器在添加32位到64位整数时遇到了挑战,但是我已经用Intel ICC 11,ICC 14和GCC 5.3证实了这种行为。 这个线程证实了我的发现,但是不清楚符号或零扩展是否必要。 只有在高32位还没有设置的情况下,这个符号/零扩展才是必要的。 但是,x86-64 ABI不会足够聪明,需要吗? 我有点不情愿改变我所有的指针偏移ssize_t,因为注册溢出会增加代码的caching足迹。

禁用GCC中的所有优化选项

使用GCC编译C程序的默认优化级别是-O0。 根据GCC文档closures所有优化。 例如: gcc -O0 test.c 但是,要检查-O0是否真的closures了所有的优化 。 我执行了这个命令: gcc -Q -O0 –help=optimizers 在这里,我有点惊讶。 我有大约50个选项启用。 然后,我检查了使用这个传递给gcc的默认参数: gcc -v 我懂了: Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper Target: x86_64-linux-gnu Configured with: ../src/configure -v –with-pkgversion='Ubuntu 4.8.4- 2ubuntu1~14.04' –with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs — enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ –prefix=/usr — program-suffix=-4.8 –enable-shared –enable-linker-build-id — libexecdir=/usr/lib –without-included-gettext –enable-threads=posix –with- gxx-include-dir=/usr/include/c++/4.8 –libdir=/usr/lib –enable-nls –with- sysroot=/ –enable-clocale=gnu –enable-libstdcxx-debug –enable-libstdcxx- time=yes […]

在CMake中更改CMAKE_CXX_FLAGS_DEBUG和朋友的默认值

我想在CMake中更改CMAKE_CXX_FLAGS_RELEASE或CMAKE_CXX_FLAGS_DEBUG的默认值。 基本上,我有一些项目的默认设置与CMake的不同(比如发布版本)略有不同,我不应该问自己:“哦,当添加add_compile_options时,它们的-O3或者-O2是否优先。 现在,我知道如何设置这些值,但我不知道如何使用户可以通过以下两种常用方式进行编辑:在命令行上使用DCMAKE_CXX_FLAGS_DEBUG=yourflags ,或者使用ccmake或CMakeSetup对其进行configuration。 问题是CMAKE设置和caching它们自己的默认值,如果你不使用FORCE来覆盖variables,那么“默认值”是不会改变的。 如果在我的set命令中使用FORCE: set(CMAKE_CXX_FLAGS_DEBUG blah CACHE STRING "" FORCE) ,每次脚本运行时都会覆盖它,消除了用户如果希望更改它的可能性。 我设法通过执行以下操作来破解它与CCMAKE一起工作,但是这仍然不能与cmake -DCMAKE_CXX_FLAGS_DEBUG因为它会在完成之后覆盖用户更改: set(DEFAULTS_SET FALSE CACHE BOOL "") set(CMAKE_CXX_FLAGS_DEBUG "-this -that" CACHE STRING "" FORCE) set(DEFAULTS_SET TRUE CACHE BOOL "" FORCE) 显然,这是一个讨厌的黑客攻击,并不完全工作(在cmake的情况下 – 这是什么= thisorthat)。 我也可以添加其他的构buildtypes,但是我不明白为什么只需要改变一些简单的东西就可以。 编辑2015年3月1日: 我已经创build了一个可行的解决scheme,但是我仍然对我所要做的事情不感到兴奋。 我看过其他的解决设置CMAKE_CXX_FLAGS_DEBUG和朋友的问题,但是这个解决scheme对我来说并不适用,因为我试图根据正在使用的编译器来select它们。 编译器不确定,但是,直到它已经填充我的variables。 我使用的技巧如下。 在项目命令之前,必须将标志variables设置为“特殊”。 set(CMAKE_CXX_FLAGS_DEBUG "_UNSET" CACHE STRING "") project(your_project C CXX) if(${CMAKE_CXX_FLAGS_DEBUG} STREQUAL "_UNSET") […]

为什么lambda可以比普通函数更好地被编译器优化?

在他的书The C++ Standard Library (Second Edition) Nicolai Josuttis指出,编译器比普通函数可以更好地优化lambdaexpression式。 另外,C ++编译器比普通函数更好地优化lambdaexpression式。 (页213) 这是为什么? 我认为当谈到内联时,应该没有任何区别了。 我能想到的唯一原因是编译器可能有一个更好的lambdaexpression式的本地环境,这样可以做更多的假设和执行更多的优化。

铿锵优化水平

在gcc上, 手册根据特定的优化参数( -funswitch-loops , -fcompare-elim等)来解释-O3 , -Os等的转换。 我正在寻找叮当的相同信息 。 我已经在网上看到,只有一般信息( -O2比-O1更优化, -Os优化速度,…)的man clang ,并且在Stack Overflow上看到了这个 ,但是我没有find任何相关的东西在引用的源文件中。 编辑:我发现了一个答案,但我仍然感兴趣,如果任何人有一个链接到用户手册logging所有的优化和通过-Oxselect的通行证。 目前我只是发现这个通行证列表,但没有优化级别。

为什么我们在C ++中使用volatile关键字?

可能重复: C ++:何时有易变的关键字曾帮助你? 我从来没有使用过,但我想知道为什么人们使用它? 它究竟做了什么? 我search了论坛,我发现它只有C#或Java主题。

如何用SSE4.2和AVX指令编译Tensorflow?

这是从运行脚本检查Tensorflow是否正在工作收到的消息: I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcublas.so.8.0 locally I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcudnn.so.5 locally I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcufft.so.8.0 locally I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcuda.so.1 locally I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcurand.so.8.0 locally W tensorflow/core/platform/cpu_feature_guard.cc:95] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are […]

为什么单独循环中的元素添加比组合循环中快得多?

假设a1 , b1 , c1和d1指向堆内存,并且我的数字代码具有以下核心循环。 const int n = 100000; for (int j = 0; j < n; j++) { a1[j] += b1[j]; c1[j] += d1[j]; } 该循环通过另一个外循环执行10,000次。 为了加快速度,我将代码更改为: for (int j = 0; j < n; j++) { a1[j] += b1[j]; } for (int j = 0; j < n; j++) { c1[j] += […]