草庐IT

OPTIMIZATION

全部标签

c++ - 编译器为内部函数生成程序集的问题

我正在使用英特尔SSE/AVX/FMA内在函数为某些数学函数实现完美的内联SSE/AVX指令。给定以下代码#include#includeautostd_fma(floatx,floaty,floatz){returnstd::fma(x,y,z);}float_fma(floatx,floaty,floatz){_mm_store_ss(&x,_mm_fmadd_ss(_mm_load_ss(&x),_mm_load_ss(&y),_mm_load_ss(&z)));returnx;}float_sqrt(floatx){_mm_store_ss(&x,_mm_sqrt_ss(_mm

c++ - 是否有任何理由使用右值引用来重载运算符?

有模板化的vector类(它是关于数学的,而不是容器)。我需要重载常见的数学运算。像这样重载有什么意义吗:templateVectoroperator+(constVector&left,constVector&right){std::coutresult;for(size_ti=0;iVector&&operator+(constVector&left,Vector&&right){std::coutVector&&operator+(Vector&&left,constVector&right){std::cout这个测试代码工作得很好:autov1=math::Vector(1)

c++ - 时间与 "as-if"规则

有一个很棒的questionaboutthe"as-if"rule一般来说,但我想知道在测量时间方面是否有任何异常(exception)情况。考虑这个(取自here稍作修改):usingstd::chrono;autobegin=steady_clock::now();autoresult=some_lengthy_calculation(some_params);autoend=std::chrono::steady_clock::now();std::cout(end-begin).count()允许编译器应用任何产生相同结果的优化。这里的要点是“as-if”规则并不直接适用于测量

C++ std::stringstream 操作优化

我的情况如下:我有一个二进制文件,我正在使用std::fstream读取操作作为(char*)读取我的目标是从文件中取出每个字节,将其格式化为十六进制,然后将其附加到一个字符串变量中字符串变量应包含按照第2项格式化的文件的全部内容。例如,假设我有以下二进制文件内容:D0469857A0249956A3我格式化每个字节的方式如下:stringstreamfin;;for(size_ti=0;i(fileb[i]);}//thiswouldyieldtheoutput"D0469857A0249956A3"returnfin.str();上述方法按预期工作,但是,据我所知,它对于大文件来说

c++ - 优化文件打开和读取

我有一个在Windows上运行的C++应用程序,它每15分钟唤醒一次以打开和读取目​​录中的文件。每次运行时目录都会更改。打开由ifstream.open(file_name,std::ios::binary)执行读取由streambufios::rdbuf()*执行*每15分钟的文件总数约为50,000文件以20个为一组打开和读取每个文件的大小在50KB左右对于每次运行;此操作(打开和读取)在磁盘主轴速度为6000RPM的双核机器上大约需要18-23分钟。我捕获了内存页面错误/秒,它们在8000–10000的范围内。有没有办法减少页面错误并优化文件打开和读取操作?高瑟姆

c++ - 替换大量异常使用的最佳方法?

我有一个我不久前制作的旧C++项目。嗯,它是一个CPU模拟器。每当我的代码中发生CPU故障(例如被零除或调试断点中断等)时,它只会执行throw并且在我的主循环中我有这样的事情:try{*(uint32_t*)&op_cache=ReadDword(cCS,eip);(this->*Opcodes[op_cache[0]])();eip=(uint16_t)eip+1;}catch(CpuInt_excperr){err.code&=0x00FF;switch(err.code){case0:case1://.....Int16(err.code);break;default:thro

c++ - 为什么这个 OpenMP 程序比单线程程序慢?

请看这段代码。单线程程序:http://pastebin.com/KAx4RmSJ.编译:g++-lrt-O2main.cpp-onnlv2带openMP的多线程:http://pastebin.com/fbe4gZSn编译:g++-lrt-fopenmp-O2main_openmp.cpp-onnlv2_openmp我在双核系统上对其进行了测试(因此我们有两个并行运行的线程)。但是多线程版本比单线程版本慢(而且显示时间不稳定,多运行几次)。怎么了?我哪里弄错了?一些测试:单线程:LayersNeuronsInputs---Time(ns)10200200---189898310500

c++ - 优化矩阵旋转 - 关于矩阵中心的任意角度

我正在尝试优化非常大的图像的旋转,最小的是4096x4096或约1600万像素。旋转总是围绕图像的中心,图像不一定总是正方形但总是2的幂。我可以访问MKL/TBB,其中MKL是针对我的目标平台优化的BLAS。我完全不知道这个操作是否在BLAS中。到目前为止,我对4096x4096图像的最佳尝试是大约17-25毫秒(对于相同的图像大小非常不一致,这意味着我可能会在整个缓存中踩踏)。矩阵是16字节对齐的。现在,无法调整目的地的大小。因此,裁剪应该而且可能发生。例如,旋转45度的方阵肯定会在拐角处被裁剪,该处的值应为零。目前,我最好的尝试是使用平铺方法-尚未对平铺尺寸或循环展开进行优雅处理。

c++ - 为什么预分配函数指针的性能比分支差?

我有一个带有enum成员变量的类。其中一个成员函数基于此enum的行为,因此作为“可能的”优化,我将两种不同的行为作为两个不同的函数,并为类提供了一个在构造时设置的成员函数指针.我模拟了这样的情况:enumcatMode{MODE_A,MODE_B};structcat{cat(catModemode):stamp_(0),mode_(mode){}voidupdate(){stamp_=(mode_==MODE_A)?funcA():funcB();}uint64_tstamp_;catModemode_;};structcat2{cat2(catModemode):stamp_(0

c++ - C/C++ 中固定长度实数输入数据的高效二维 FFT

我正在开发一种多次调用FFT函数的算法。我有几个时间限制(需要实时),所以我需要尽量减少每次FFT调用所花费的时间。我正在使用OpenCV库,我已经用两种不同的方法实现了我的代码:使用FFTW库。数据/内存管理+FFT(8ms)=14ms(平均,FFT_MEASURE标志)。使用OpenCVfft函数。数据/内存管理+FFT(21ms)=23ms(平均值)。由于我的输入数据总是固定为512x512像素的真实图像,你认为如果我自己实现基于DFT数学定义的FFT算法,存储正弦/余弦表,我可以获得更好的性能还是FFTW库真的很优化吗?有更好的想法吗?所有想法和建议将不胜感激。到目前为止,我不