草庐IT

c++ - 将数组的所有元素相加的 SSE 指令

这个问题在这里已经有了答案:Sumreductionofunsignedbyteswithoutoverflow,usingSSE2onIntel(3个答案)关闭5年前。我是SSE2指令的新手。我找到了一条指令_mm_add_epi8可以添加两个数组元素。但是我想要一个可以添加数组所有元素的SSE指令。我试图使用这段代码来发展这个概念:#include#include#includevoidsse(unsignedchar*a,unsignedchar*b);voidmain(){/*unsignedchar*arr;arr=(unsignedchar*)malloc(50);*/un

c++ - SSE指令中的UnsignedSaturate是什么意思?

我正在将SIMD代码转换为等效的C代码。我被困在SSE指令之一__m128i_mm_packus_epi16(__m128ia,__m128ib)返回r0:=UnsignedSaturate(a0)r1:=UnsignedSaturate(a1)...r7:=UnsignedSaturate(a7)r8:=UnsignedSaturate(b0)r9:=UnsignedSaturate(b1)...r15:=UnsignedSaturate(b7)UnsignedSaturate是什么意思? 最佳答案 基本上,“饱和度”意味着超过某

c++ - Constexpr 和 SSE 内在函数

大多数C++编译器支持SIMD(SSE/AVX)指令,其内部结构如_mm_cmpeq_epi32我的问题是这个函数没有被标记为constexpr,虽然“语义上”没有理由让这个函数不是constexpr,因为它是一个纯函数。有什么方法可以编写我自己的(例如)_mm_cmpeq_epi32版本,即constexpr?显然我希望该函数在运行时使用适当的asm,我知道我可以使用constexpr的慢函数重新实现任何SIMD函数。如果您想知道我为什么关心SIMD函数的constexpr。非constexprness具有传染性,这意味着我的任何使用这些SIMD函数的函数都不能是constexpr。

c++ - SSE 内在函数 - 比较 if/else 优化

我一直在尝试优化一些处理原始像素数据的代码。目前代码的C++实现速度太慢,所以我一直在尝试在MSVC2008中使用SSE内在函数(SSE/2/3不使用4)。考虑到这是我第一次深入挖掘,我'我们取得了一些不错的进展。不幸的是,我遇到了一段让我卡住的特定代码://Beginbad/suboptimalSSEcode__m128ivnMask=_mm_set1_epi16(0x0001);__m128ivn1=_mm_and_si128(vnFloors,vnMask);for(intm=0;m目前,我在这部分默认使用C++实现,因为我无法完全理解如何使用SSE对其进行优化-我发现SSE内在

c++ - 如何将两个 SSE 寄存器加在一起

我有两个SSE寄存器(128位是一个寄存器),我想将它们相加。我知道如何在其中添加相应的单词,例如,如果我在寄存器中使用16位单词,我可以使用_mm_add_epi16来完成,但我想要的是_mm_add_epi128(不存在),这将使用register作为一个大词。有什么方法可以执行此操作,即使需要多条指令?我正在考虑使用_mm_add_epi64,检测右字溢出,然后在需要时向寄存器中的左字加1,但我也希望这种方法适用于256位寄存器(AVX2),并且这种方法似乎太复杂了。 最佳答案 要添加两个128位数字x和y给z与SSE你可以这

c++ - 编译器如何处理 SSE(或任何)内部函数?

前一段时间我在某处读到SSE内部函数编译成高效的机器代码,因为编译器对待它们的方式与普通函数不同。我在想编译器实际上是如何做的,以及C程序员可以做些什么来促进这个过程。是否有关于如何以一种使编译器更容易生成高效机器代码的方式使用内部函数的指南。谢谢。 最佳答案 与Necrolis所写的相反,内在函数可能会也可能不会编译成它们所代表的指令。对于_mm_load_pd等复制或加载指令尤其如此,因为在使用内部函数时编译器仍负责寄存器分配和赋值。这意味着如果两个位置可以由同一个寄存器表示,则可能根本不需要将值从一个位置复制到另一个位置。在这

c++ - 在 Mac OS X Lion 上使用 OpenMP 编译失败(memcpy 和 SSE 内在函数)

我偶然发现了以下问题。下面的代码片段在MacOSX上没有链接到我尝试过的任何Xcode(4.4,4.5)#include#include#includeintmain(intargc,char*argv[]){char*temp;#pragmaompparallel{__m128dv_a,v_ar;memcpy(temp,argv[0],10);v_ar=_mm_shuffle_pd(v_a,v_a,_MM_SHUFFLE2(0,1));}}该代码仅作为示例提供,运行时会出现段错误。关键是它不编译。使用以下行完成编译/Applications/Xcode.app/Contents/De

c++ - SSE减少浮点 vector

如何使用sse内在函数获取浮点vector的总和元素(减少)?简单的串口代码:void(float*input,float&result,unsignedintNumElems){result=0;for(autoi=0;i 最佳答案 通常您会在循环中生成4个部分和,然后在循环后对4个元素进行水平求和,例如#include#include#includefloatvsum(constfloat*a,intn){floatsum;__m128vsum=_mm_set1_ps(0.0f);assert((n&3)==0);assert(

c++ - 使用 SSE 加速计算——存储、加载和对齐

在我的项目中,我实现了基本类CVector。此类包含指向原始float组的float*指针。该数组是使用标准malloc()函数动态分配的。现在我必须使用这样的vector来加速一些计算。不幸的是,由于未使用_mm_malloc()分配内存,因此未对齐。据我所知,我有两个选择:1)重写分配内存以使用_mm_malloc()的代码,例如使用如下代码:voidsub(float*v1,float*v2,float*v3,intsize){__m128*p_v1=(__m128*)v1;__m128*p_v2=(__m128*)v2;__m128res;for(inti=0;i2)第二种选择

c++ - SSE2代码优化

我正在使用SSE2内在函数来优化我的应用程序的瓶颈并有以下问题:ddata=_mm_xor_si128(_mm_xor_si128(_mm_sll_epi32(xdata,0x7u),_mm_srl_epi32(tdata,0x19u)),xdata);在MicrosoftC++编译器上,这不会编译,因为类型__m128i和unsignedint(传递给_mm_sll_epi32指令)不可互换。为什么会这样,我应该如何将任意unsignedint值传递给_mm_sll_epi32?_m128i是:typedefunion__declspec(intrin_type)_CRT_ALIGN