草庐IT

​​SSE

全部标签

c++ - 设置 SSE 寄存器中的最后或前 n 位

我如何创建一个__m128i并设置了n个最高有效位(在整个vector中)?我需要它来屏蔽与计算相关的缓冲区部分。如果可能的话,解决方案应该没有分支,但这似乎很难实现我该怎么做? 最佳答案 我将此添加为第二个答案,并将第一个答案留给历史兴趣。看起来你可以用_mm_slli_epi64做一些更有效的事情:#include#include__m128ibit_mask(intn){__m128iv0=_mm_set_epi64x(-1,-(n>64));//ANDmask__m128iv1=_mm_set_epi64x(-(n>64),

c++ - 什么是 __memset_sse2 以及它为什么执行这么多指令?

我有两个算法的C++实现,称它们为A和B.A之间的唯一区别和B是那个A使用std::unordered_maphashmap;但是B使用google::dense_hash_maphashmap;.我在A中找到了一个输入与B相比慢得多我不明白为什么。对于相同的输入,我运行sudoperfrecord-einstructions./Ainput.txt然后我得到这个结果:OverheadCommandSharedObjectSymbol65.90%Alibc-2.23.so[.]__memset_sse26.63%Alibc-2.23.so[.]_int_malloc3.44%Alibc

c++ - SSE Intrinsics 和循环展开

我正在尝试优化一些循环并且我已经成功了,但我想知道我是否只做了部分正确的事情。比如说我有这个循环:for(i=0;i将它展开3倍,产生这个:intunroll=(n/4)*4;for(i=0;i现在是SSE翻译等价物:__m128ai_v=_mm_loadu_ps(&a[i]);__m128two_v=_mm_set1_ps(2);__m128ai2_v=_mm_mul_ps(ai_v,two_v);_mm_storeu_ps(&b[i],ai2_v);或者是:__m128ai_v=_mm_loadu_ps(&a[i]);__m128two_v=_mm_set1_ps(2);__m12

c++ - AVX/SSE 回合向下 float 并返回整数 vector ?

有没有办法使用AVX/SSE获取浮点vector、向下舍入并生成整数vector?所有的floor内部方法似乎都产生了一个浮点的最终vector,这很奇怪,因为四舍五入产生了一个整数! 最佳答案 SSE可以从FP转换为整数,您可以选择截断(向零)或当前舍入模式(通常是IEEE默认模式,最接近平局舍入为偶数。像nearbyint(),与round()不同,其中tiebreak是远离0。如果您需要x86上的舍入模式,youhavetoemulateit,perhapswithtruncateasabuildingblock。)相关说明为

C++ SSE3 指令集未启用

我正在尝试使用来自的HMMlib库在C++中处理一些隐藏的马尔可夫代码http://www.cs.au.dk/~asand/?page_id=152我使用的是ubuntu12.04,带有gcc/g++4.6我的编译步骤说明是:g++-I/usr/local/boost_1_52_0-I../MAIN.cpp这会产生以下错误:Infileincludedfrom../HMMlib/allocator_traits.hpp:25:0,from../HMMlib/hmm_table.hpp:25,fromMAIN.cpp:1:/usr/lib/gcc/i686-linux-gnu/4.6/i

c++ - 从 SSE 切换到 AVX 会受到惩罚吗?

我知道在没有先将所有ymm寄存器的上半部分清零的情况下从AVX指令切换到SSE指令的现有惩罚,但在我的机器(i7-3939K3.2GHz)上的特殊情况下,似乎即使我确实在AVX代码部分前后明确使用_mm256_zeroupper,也会对相反方向(SSE到AVX)造成很大的惩罚。我已经编写了在32位float和32位定点整数之间转换的函数,在2个32768个元素宽的缓冲区上。我将一个SSE2内部版本直接移植到AVX以在SSE的4个元素上同时处理8个元素,期望看到显着的性能提升,但不幸的是,相反的情况发生了。所以,我有两个功能:voidConvertPcm32FloatToPcm32Fix

c++ - SSE 内在函数 : masking a float and using bitwise and?

基本上这个问题与x86汇编器有关,您有一个数字,您希望使用and将其设置为零或数字本身。.如果你andnumber为负数你会得到number本身,但如果你and它与零你得到零。现在我在使用SSEinstrinsics时遇到的问题是float在二进制中与double不同(或者我弄错了)。无论如何,这是代码,我尝试使用各种float来掩盖第二个和第三个数字(分别为127.0f和99.0f),但没有成功。#include#includevoidprint_4_bit_num(constchar*label,__m128var){float*val=(float*)&var;printf("%

c++ - SSE版本的差平方和算法的累积计算误差

我正在尝试优化以下代码(两个数组的平方差之和):inlinefloatSquare(floatvalue){returnvalue*value;}floatSquaredDifferenceSum(constfloat*a,constfloat*b,size_tsize){floatsum=0;for(size_ti=0;i所以我使用CPU的SSE指令进行了优化:inlinevoidSquaredDifferenceSum(constfloat*a,constfloat*b,size_ti,__m128&sum){__m128_a=_mm_loadu_ps(a+i);__m128_b=

c++ - 没有 AVX2 的 32 位整数的 SSE 整数 2^n 次幂

我找不到用于计算2^n的SSE指令对于vector__m128i32位整数。是否有执行以下伪代码的指令或函数?__m128ipower_of_two(__m128ib){__m128r;for(inti=0;i_mm_sll_epi32指令只计算r[i]=a[i]. 最佳答案 AVX2之前没有单一指令,但即使只有SSE2,也有一个技巧可以滥用浮点格式来生成2的幂,方法是使用整数算法生成指数字段,然后将其从float转换为整数.可能有更快的选择。__m128ipower_of_two(__m128ib){__m128iexp=_mm_

c++ - 检查运行时是否支持 SSE

这个问题在这里已经有了答案:HowtocheckifaCPUsupportstheSSE3instructionset?(7个答案)cpudispatcherforvisualstudioforAVXandSSE(3个答案)关闭7年前。我想检查运行时是否支持SSE4或AVX,以便我的程序可以利用处理器特定指令,而无需为每个处理器创建二进制文件。如果我可以在运行时确定它,我可以使用一个接口(interface)并在不同的指令集之间切换。