草庐IT

c++ - 如何加快积分图像的计算?

我经常需要计算积分图像。这是一个简单的算法:uint32_tvoidintegral_sum(constuint8_t*src,size_tsrc_stride,size_twidth,size_theight,uint32_t*sum,size_tsum_stride){memset(sum,0,(width+1)*sizeof(uint32_t));sum+=sum_stride+1;for(size_trow=0;row我有一个问题。我可以加快此算法的速度(例如,使用SSE或AVX)吗? 最佳答案 算法中有一个令人讨厌的特征:

c++ - 您需要付出多少努力才能从使用 SSE 中获得 yield ?

案例一假设你有一个小类(class):classPoint3D{private:floatx,y,z;public:operator+=()...etc};Point3D&Point3D::operator+=(Point3D&other){this->x+=other.x;this->y+=other.y;this->z+=other.z;}简单地使用SSE会简单地使用一些内在函数来替换这些函数体。但是我们会期望这会产生很大的不同吗?MMX曾经涉及昂贵的状态cahngesIIRC,SSE还是它们就像其他指令一样?即使没有直接的“使用SSE”开销,将值移入SSE寄存器并再次退出真的会使

c++ - Visual Studio 2012 中的 _mm_prefetch 在哪里?

我想使用指令_mm_prefetch。MSDNspecifies它在标题mmintrin.h中,但没有。我使用VisualStudio2012。 最佳答案 看起来像是他们文档中的错误。我在中找不到它要么,但它似乎在中.在VS2010中编译:#includeintmain(){_mm_prefetch(0,0);return0;} 关于c++-VisualStudio2012中的_mm_prefetch在哪里?,我们在StackOverflow上找到一个类似的问题:

c++ - _ftol2_sse,有更快的选择吗?

我的代码调用了很多intmyNumber=(int)(floatNumber);这总共占用了我CPU时间的大约10%(根据分析器)。虽然我可以就此打住,但我想知道是否有更快的选择,所以我尝试四处搜索,然后偶然发现了http://devmaster.net/forums/topic/7804-fast-int-float-conversion-routines/http://stereopsis.com/FPU.html我尝试实现那里给出的Real2Int()函数,但它给了我错误的结果,而且运行速度较慢。现在我想知道,是否有更快的实现将double/float值转换为整数,或者SSE2版

c++ - C/C++ : -msse and -msse2 Flags do not have any effect on the binaries?

我只是在玩弄gcc(g++)和编译器标志-msse和-msse2。我有一个看起来像这样的小测试程序:#includeintmain(intargc,char**argv){floata=12558.5688;floatb=6.5585;floatresult=0.0;result=a*b;std::cout当我用下面的语句编译它时:/usr/local/bin/g++-4.9-W-mssemain.cpp-otestsse和/usr/local/bin/g++-4.9-W-msse2main.cpp-otestsse2输出文件是二进制相等的。但由于SMID标志,我预计它们并不相同。所以

c++ - 在现代 x86_64 CPU 上,AVX/SSE 求幂需要多少个时钟周期?

现代x86_64CPU上的AVX/SSE求幂需要多少个时钟周期?我是关于:pow(x,y)=exp(y*log(x))即exp()和log()AVXx86_64指令都需要特定的已知周期数吗?exp():_mm256_exp_ps()日志():_mm256_log_ps()或者循环数可能会根据指数级而变化,是否有最大循环数可以消耗指数? 最佳答案 x86SIMD指令集(即不是x87),至少到AVX2,不包括SIMDexp、log或powpow(x,0.5)除外,它是平方根。然而,有一些SIMD数学库是根据具有这些函数(以及其他函数)的

c++ - 如何截断 XMM 寄存器中的浮点值

如何只获取float的整数部分?所以,我有一个float组:x[4]={5.0,13.0,25.0,41.0};我把它放在xmm0中,然后用它做sqrt。我还需要一个命令来帮助仅获取此sqrt的一部分。例如5的sqrt将是2.236068,我只需要2.0的答案代码:__asm{movupsxmm0,xsqrtpsxmm0,xmm0//hereneedsomecommandmovupsx,xmm0} 最佳答案 使用roundps是最简单的。舍入模式表在其他地方,但您需要舍入模式3(接近零)。只有当输入保证在某个范围内(大约0到4.6e

c++ - 水平求和 SSE 无符号字节 vector 的最快方法

我需要水平添加一个__m128i,它是16xepi8值。XOP指令将使这变得微不足道,但我没有可用的指令。目前的方法是:hd=_mm_hadd_epi16(_mm_cvtepi8_epi16(sum),_mm_cvtepi8_epi16(_mm_shuffle_epi8(sum,swap)));hd=_mm_hadd_epi16(hd,hd);hd=_mm_hadd_epi16(hd,hd);到SSE4.1有没有更好的方法? 最佳答案 您可以使用SSE2的_mm_sad_epu8(psadbw)来做到这一点,例如:inlineuin

c++ - 从 __m128i 中查找最小值/最大值

我想使用SIMD操作找到字节数组中的最小值/最大值。到目前为止,我能够遍历数组并将最小值/最大值存储到__m128i变量中,但这意味着我正在寻找的值与其他值混合在一起(确切地说是另外15个值)。我找到了这些讨论here和here对于整数,thispage对于float,但我不明白_mm_shuffle*是如何工作的。所以我的问题是:我必须执行哪些SIMD操作才能从__m128i变量中提取最小/最大字节(或无符号字节)值?_mm_shuffle*是如何运作的?当我在线查看“最小”文档时,我不明白。我知道它与_MM_SHUFFLEmacro有关,但我不明白这个例子。

c++ - AVX2 float 比较并得到 0.0 或 1.0 而不是全 0 或全 1 位

基本上,在生成的vector中,我想为所有输入浮点值>1保存1.0,而为所有输入浮点值floatf[8]={1.2,0.5,1.7,1.9,0.34,22.9,18.6,0.7};floatr[8];//Mustbe{1,0,1,1,0,1,1,0}__m256itmp1=_mm256_cvttps_epi32(_mm256_loadu_ps(f));__m256itmp2=_mm256_cmpgt_epi32(tmp1,_mm256_set1_epi32(1));_mm256_store_ps(r,_mm256_cvtepi32_ps(tmp2));for(inti=0;i但我没有得