草庐IT

OPTIMIZATION

全部标签

c++ - 检测 C++ 二进制文件是否被优化

是否有标志或其他可靠方法来检测编译的C++二进制文件是否经过优化编译?我接受特定于编译器的解决方案。编辑:这是针对构建部署系统的,它可能会意外部署未正确构建的二进制文件。防水解决方案不太可能,但如果在某些时候可以检测到这一点,它将减少一些痛苦(和金钱)。编译器通常是gcc,有时是sun,如果有MSVC解决方案,为了社区的利益,我不想排除它。 最佳答案 最新版本的GCC有一个waytoreportwhichflagswereusedtocompileabinary(第三个要点)。有一个相关的命令行开关(--fverbose-asm)“

c++ - 通过 ARM NEON 汇编最大优化元素乘法

我正在为双Cortex-A9处理器优化两个一维数组的逐元素乘法。主板上运行的是Linux,我使用的是GCC4.5.2编译器。所以下面是我的C++内联汇编函数。src1、src2和dst是16字节对齐的。更新:可测试代码:voidMultiply(constfloat*__restrict__src1,constfloat*__restrict__src2,float*__restrict__dst,constunsignedintwidth,constunsignedintheight){intloopBound=(width*height)/4;asmvolatile(".loop:

c++ - 复制到数组时的 memcpy 与赋值;为什么这会生成不同的代码?

编译以下代码时,#includestructX{chara,b,c,d;};voidcopy_assignment(char*p,Xx){*p++=x.a;*p++=x.b;*p++=x.c;*p++=x.d;}voidcopy_memcpy(char*p,Xx){memcpy(p,&x,sizeof(X));}GCC和clang都为copy_assignment发出一系列movb指令,同时为copy_memcpy发出单个movl指令。假设X没有填充,而这里没有,那么两者不应该是等价的吗?单个movl不是更有效吗?准确地说,我正在编译:g++-O3-S-oprog.Sprog.cpp和

c++ - 除非返回值有名称,否则为什么 GCC 无法优化?

考虑这段代码:#includeclassC{std::arraya{};intb{};};Cslow(){return{};}Cfast(){Cc;returnc;}GCC6到9为slow()生成非常臃肿的代码:slow():xoreax,eaxmovDWORDPTR[rsp-25],0movBYTEPTR[rsp-21],0movedx,DWORDPTR[rsp-24]movDWORDPTR[rsp-32],0movWORDPTR[rsp-28],axmovBYTEPTR[rsp-26],0movrax,QWORDPTR[rsp-32]retfast():xoreax,eaxxore

c++ - 图片/"most resembling pixel"搜索优化?

情况:假设我有一个图像A,例如512x512像素和图像B,5x5或7x7像素。两个图像都是24位rgb,B有1位alpha掩码(所以每个像素要么完全透明要么完全实心)。我需要在图像A中找到一个像素(及其相邻像素)与图像B最相似的像素,或者可能与图像B最相似的像素。相似度计算为“距离”,即非透明B的像素与A的像素之间的“距离”之和除以非透明B的像素数。以下是用于解释的示例SDL代码:structPixel{unsignedcharb,g,r,a;};voidfillPixel(intx,inty,SDL_Surface*dst,SDL_Surface*src,intdstMaskX,in

c++ - gcc 的 asm volatile 是否等同于递归的 gfortran 默认设置?

我只是在研究C++和Fortran中的递归函数,我意识到Fortran中的一个简单递归函数几乎是与其等效的C++函数一样快。现在,在进入这个之前,我知道这里有类似的问题,特别是:Whydoesaddingassemblycommentscausesuchradicalchangeingeneratedcode?Workingofasmvolatile(“”:::“memory”)Equivalenttoasmvolatileingfortran但是,我有一点更具体和困惑,因为Fortran编译器似乎正在做你可以用gcc中的asmvolatile实现的事情。为了给您一些上下文,让我们考虑

c++ - C/C++编译器反馈优化

有没有人看到过不同程序的真实世界数字,这些程序使用C/C++编译器提供的反馈优化来支持分支预测、缓存预加载功能等。我搜索了它,令人惊讶的是,甚至流行的解释器开发组似乎都没有检查过效果。并且将ruby​​、python、php等性能提高10%左右应该被认为是有用的。真的没有任何好处还是整个开发者社区只是懒得使用它? 最佳答案 10%是一个很好的大概数字。也就是说,...您必须真正关心性能才能走这条路。我从事的产品(DB2)使用PGO和其他侵入式和积极的优化。这些成本包括大量构建时间(在某些平台上是三倍)以及开发和支持噩梦。当出现问题时

c++ - 如何用Ceres解决大规模非线性优化问题?

我需要优化由点的二维网格表示的表面,以生成与提供的目标法vector对齐的表面法vector。网格大小可能在201x201和1001x1001之间。这意味着变量的数量将为40,000到1,000,000,因为我只修改网格点的z坐标。我正在使用Ceres框架,因为它应该擅长处理大规模非线性优化问题。我已经尝试过MATLAB的fmincon,但它使用了难以置信的内存量。我写了一个适用于小网格的目标函数(在3x3和31x31上成功)。但是,当我尝试编译具有较大网格尺寸(157x200)的代码时,我看到以下错误。我读到这是Eigen的限制。但是,当我告诉Ceres使用LAPACK而不是Eige

c++ - 如何提高键类型为 std::string 的 map 查找的性能?

我正在使用std::map(VC++实现),通过map的find方法进行查找有点慢。键类型是std::string。我可以通过map的自定义键比较覆盖来提高此std::map查找的性能吗?例如,也许std::stringstring::size()比较?还有其他加快比较速度的想法吗?在我的情况下,map将始终包含更新:map包含文件路径。更新2:map的元素经常变化。 最佳答案 首先,关闭所有的性能分析和调试开关。这些会极大地减慢STL。如果不是这样,部分问题可能是字符串的前80-90%是相同的。这对map来说不一定是坏事,但它适用

c++ - 使用 -O3 优化和奇数间距填充 16bpp 图像时崩溃

我编写了一个非常简单的代码来用一个常量值(1024)填充32x3216bpp图像。图像缓冲区由std::vector托管。我的图像的间距/步幅(即两个连续行之间的字节数)足够大以容纳整行,但设置为奇数。这是我的代码:#include#includeintmain(){intwidth=32;intheight=32;intpitch=width*2+1;std::vectorimage(height*pitch);uint8_t*buffer=&image[0];for(inty=0;y(buffer+y*pitch);for(intx=0;x我正在使用带有gcc4.6.1(Ubunt