(出于测试目的)我写了一个简单的方法来计算nxn矩阵的转置voidtranspose(constsize_t_n,double*_A){for(uinti=0;i当使用优化级别O3或Ofast时,我希望编译器展开一些循环,这将导致更高的性能,尤其是当矩阵大小是2的倍数时(即,每次迭代都可以执行双循环体)或类似情况。相反,我测量的结果恰恰相反。2的幂实际上显示了执行时间的显着峰值。这些尖峰也以64为固定间隔,以128为间隔更明显,依此类推。每个尖峰都延伸到相邻的矩阵大小,如下表所示sizentime(us)10202649102128151022310010235428102415791
(出于测试目的)我写了一个简单的方法来计算nxn矩阵的转置voidtranspose(constsize_t_n,double*_A){for(uinti=0;i当使用优化级别O3或Ofast时,我希望编译器展开一些循环,这将导致更高的性能,尤其是当矩阵大小是2的倍数时(即,每次迭代都可以执行双循环体)或类似情况。相反,我测量的结果恰恰相反。2的幂实际上显示了执行时间的显着峰值。这些尖峰也以64为固定间隔,以128为间隔更明显,依此类推。每个尖峰都延伸到相邻的矩阵大小,如下表所示sizentime(us)10202649102128151022310010235428102415791
当使用GCC4.8/4.9/5.1使用-O3编译程序时,我无法确定段错误的原因。对于GCC4.9.x,我在Cygwin、Debian8(x64)和Fedora21(x64)上看到过它。其他人在GCC4.8and5.1上体验过.该程序在-O2下运行良好,在其他版本的GCC下运行良好,在其他编译器(如MSVC、ICC和Clang)下运行良好。下面是GDB下的崩溃,但没有任何东西跳出来。misc.cpp:26的源代码如下,但它是一个简单的XOR:((word64*)buf)[i]^=((word64*)mask)[i];有问题的代码会在转换之前检查64位字对齐。从-O3下的反汇编,我知道它与
这个问题在这里已经有了答案:What'sthedifferencebetween-O3and(-O2+flagsthatmangccsays-O3addsto-O2)?(2个答案)关闭8年前。这是我正在查看的函数:templateinlineuint64_tparseUnsigned(constchar(&buf)[Size]){uint64_tval=0;for(uint8_ti=0;i我有一个测试工具,它传递所有可能的数字,其中Size=5,左边用空格填充。我正在使用GCC4.7.2。当我在使用-O3编译后在callgrind下运行程序时,我得到:Irefs:7,154,919当我
在下面的程序中,我希望test1由于依赖指令而运行得更慢。使用-O2进行的测试似乎证实了这一点。但后来我尝试使用-O3,现在时间差不多相等。怎么会这样?#include#include#include#includevolatileintx=0;//usedforpreventingcertainoptimizationsenum{size=60*1000*1000};std::vectora(size+x);//`size+x`makesthevectorsizeunknownbycompilerstd::vectorb(size+x);voidtest1(){for(autoi=1
我想知道如果我只在gcc(在Ubuntu12.04上运行的版本4.8.1)中指定优化级别3,或者如果我必须明确指定整个程序优化作为gcc选项,是否完成了整个程序优化? 最佳答案 -fwhole-program(和-flto)不会由任何-O选项自动设置。来源:http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html.属于-O优化级别的选项在此处被标记为此类,并且还有每个-O的启用选项列表。 关于c++-如果我设置优化-O3,是否在gcc
我正在编写一个C++程序,当我使用优化(选项-O1、-O2、-O3等)编译它时,它无法运行(出现段错误),但当我在没有优化的情况下编译它。有没有可能是我的代码有错误?还是我应该假设这是GCC中的错误?我的GCC版本是3.4.6。是否有任何已知的解决此类问题的方法?我的程序的优化版本和未优化版本在速度上存在很大差异,因此我确实需要使用优化。这是我原来的仿函数。一个在没有优化级别的情况下工作正常并且在任何优化级别都抛出段错误的:structdistanceToPointSort{indexedDocument*point;distanceToPointSort(indexedDocumen
我遇到了GCC4.6.3的问题,我找不到任何逻辑解决方案/解释。我正在从事一个将带有操作系统的嵌入式固件应用程序移植到基于Linux的应用程序的项目。该应用程序有一大堆单元测试,可以通过参数激活这些单元测试以检查代码/功能的完整性。当我在调试中编译时,一切都100%正常并且所有单元测试都通过了。但是,我在发布构建时遇到了问题(使用-O3优化)。我设法隔离了有问题的文件。该文件来self们未编码的外部包,我们根本不想更改它。我查阅了GCC的文档以获得-O3中包含的所有优化。这是我得到的:-fauto-inc-dec-fcprop-registers-fdce-fdefer-pop-fds
当使用g++(GCC)4.8.320140911(RedHat4.8.3-7)编译以下代码时,使用编译命令"g++-g-fno-omit-frame-pointer-msse2-mssse3-O3Memory.cpp”,可执行文件在执行时引发“非法指令(核心转储)”。它使用与旧版g++完全相同的编译器标志编译和运行没有问题。当编译器标志“-mssse3-O3”被删除或替换为较低的优化级别(例如“-O2”)时,它也可以毫无问题地编译和运行。如果同时使用旧版和新版g++编译器,需要编译器标志“-msse2-mssse3-O3”,并且需要可移植的对齐内存分配器,那么存在哪些选项?以下代码中是
在经历了许多痛苦和痛苦之后,我发现了一些非常奇怪的行为,当给定一个boost::filter_iterator的范围时,std::distance永远不会返回一个std::deque。看来问题是具有-O3优化的GCC(6.1+)所独有的。这是一个演示违规行为的示例:#include#include#include#include#includestructFoo{std::stringbar,s="";chara='\0';};intmain(){conststd::dequefoos(14,{""});conststd::stringtest{};constautop=[test](