草庐IT

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

c++ - AVX2 在 Haswell 上比 SSE 慢

我有以下代码(正常、SSE和AVX):inttestSSE(constaligned_vector&ghs,constaligned_vector&lhs){intresult[4]__attribute__((aligned(16)))={0};__m128ivresult=_mm_set1_epi32(0);__m128iv1,v2,vmax;for(intk=0;kmymax){mymax=result[k];}}returnmymax;}inttestAVX(constaligned_vector&ghs,constaligned_vector&lhs){intresult[8

c++ - gcc 是否使用 Intel 的 SSE 4.2 指令进行文本处理(如果可用)?

我读了hereIntel引入了SSE4.2指令来加速字符串处理。文章引述:TheSSE4.2instructionset,firstimplementedinIntel'sCorei7,providesstringandtextprocessinginstructions(STTNI)thatutilizeSIMDoperationsforprocessingcharacterdata.Thoughoriginallyconceivedforacceleratingstring,text,andXMLprocessing,thepowerfulnewcapabilitiesofthes

c++ - SIMD/SSE : How to check that all vector elements are non-zero

我需要检查所有vector元素是否非零。到目前为止,我找到了以下解决方案。有一个更好的方法吗?我在Linux/x86_64上使用gcc4.8.2,指令高达SSE4.2。typedefcharChrVect__attribute__((vector_size(16),aligned(16)));inlinebooltestNonzero(ChrVectvect){constChrVectvzero={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};return(0==(__int128_t)(vzero==vect));}更新:上面的代码被编译为以下汇编代码(当编译为非