草庐IT

​​SSE

全部标签

c++ - 用于 SIMD/SSE 表达式延迟计算的 C/C++ 库

intel-MKL等库或amd-ACML为vector上的SIMD操作提供更简单的接口(interface),但我想将几个函数链接在一起。是否有现成的库,我可以在其中为像这样的表达式注册解析树log(tanh(x)+exp(x))然后对数组的所有成员进行评估?我想避免的是制作tanh(x)的临时数组,exp(x)和tanh(x)+exp(x)通过为tanh()调用mkl或acml函数,exp()和+.我可以手动展开循环并直接使用sse指令,但想知道是否有C++库可以为您执行此操作,即1.HandlesSIMD/SSEfunctions2.Allowsbuildingofparsetre

c++ - 性能与 SSE 相同

我矢量化了以下循环,它出现在我正在开发的应用程序中:voidvecScl(Node**A,Node*B,longval){intfact=round(dot/const);for(i=0;ivector[i]-=fact*B->vector[i];}这是SSE代码:voidvecSclSSE(Node**A,Node*B,longval){intfact=round(dot/const);__m128ivecPi,vecQi,vecCi,vecQCi,vecResi;intsseBound=SIZE/4;for(i=0,j=0;jvector)[i]);vecQi=_mm_set_ep

c++ - 访问 SSE 寄存器变量

这个问题在这里已经有了答案:What'sthemostefficientwaytoloadandextract32bitintegervaluesfroma128bitSSEvector?(2个答案)关闭8年前。我想访问SSE变量的各个元素。那可能吗。例如,__m128ia=_mm_set_epi32(10,15,20,30);现在,我只想访问第一个元素。例如上述情况下的30。我在stackoverflow中看到前面的例子是int*val=(int*)&a;然后通过val[0]访问。但我不想要任何中间变量。我试过类似下面的东西intb=((int*)a[0])andsimilarlyo

c++ - SSE 与类(class)保持一致

有一些非常奇怪的问题,作为c++的初学者,我不知道为什么。structDeviceSettings{public:....somevariablesDXSizeBackbufferSize;....somemethods};structDXPoint;typedefDXPointDXSize;__declspec(align(16))structDXPoint{public:union{struct{intx;inty;};struct{intwidth;intheight;};intdataint[2];__m128im;};DXPoint(void);DXPoint(intx,in

c++ - 在 x64 上获取没有 __asm 的 SSE 版本

我正在尝试构建VS2010CRT库的某些函数的略微修改版本,除了它尝试访问可能包含指令集体系结构版本(ISA)的全局变量的部分外,一切都很好:if(__isa_available>__ISA_AVAILABLE_SSE2){//...}elseif(__isa_available==__ISA_AVAILABLE_SSE2){//...}我在程序集文件中找到它应该包含的值__ISA_AVAILABLE_X86equ0__ISA_AVAILABLE_SSE2equ1__ISA_AVAILABLE_SSE42equ2__ISA_AVAILABLE_AVXequ3如何以及在哪里为__isa_

c++ - 关于整数和浮点性能的 SSE4 和 SSE2 - 哪个更快?

虽然您通常在CPU上获得比浮点性能更好的整数算术性能,但有人可以澄清SIMD版本的情况。例如:__m128i_mm_mul_epi32(__m128ia,__m128ib);//(multiplies2integervectors)对比:__m128_mm_mul_ps(__m128a,__m128b);//(multiplies2floatvectors)哪个会产生更高的性能?(假设机器具有SSE4功能)。我这么说是因为我根据SSE2指令编写了我自己的小数学库,我不知道我是否应该继续使用__m128i. 最佳答案 让我展示一下我回

c++ - SSE版本的modf

我有以下使用SSE内在函数的modf的工作实现,但是当我需要结果时转换为__m128i并返回过程似乎很浪费作为__m128。__m128integer=_mm_cvtepi32_ps(_mm_cvttps_epi32(value));__m128fraction=_mm_sub_ps(value,integer);是否存在不进行类型转换或一些魔术数字破解的截断指令? 最佳答案 通过SSE4.1,您可以使用roundpsandroundpd说明://SinglePrecision__m128integer=_mm_round_ps(v

c++ - C++ 中 SSE 的内存对齐,_aligned_malloc 等效?

我想知道如何将此C代码转换为C++以实现内存对齐。float*pResult=(float*)_aligned_malloc(length*sizeof(float),16);我看过here然后我试了这个float*pResult=(float*)__attribute__((aligned(16)));还有这个float*pResult=__attribute__((aligned(16)));但两者都给出了类似的错误。error:expectedprimary-expressionbefore'__attribute__'|error:expected','or';'before'

c++ - 加快一些 SSE2 Intrinsics 的颜色转换

我正在尝试执行从YCbCr到BGRA的图像颜色转换(不要问A位,好头疼)。无论如何,这需要尽可能快地执行,所以我使用编译器内部函数编写它以利用SSE2。这是我第一次涉足SIMD领域,我基本上是一个初学者,所以我确信我做的很多事情都是低效的。事实证明,我执行实际颜色转换的算术代码特别慢,Intel的VTune显示它是一个重大瓶颈。那么,有什么方法可以加快以下代码的速度吗?它以32位、一次4个像素完成。我最初尝试以8位、一次16个像素(如上循环)进行计算,但计算导致整数溢出和转换中断。整个过程,包括Inteljpeg解码,对于全高清的单场大约需要14毫秒。如果我能将它降低到至少12毫秒,最

c++ - 使用 SSE 计算矩阵乘积比使用直接算法慢得多

我想使用直接算法将两个矩阵相乘一次:templatevoidmultiplicate_straight(T**A,T**B,T**C,intsizeX){T**D=AllocateDynamicArray2D(sizeX,sizeX);transpose_matrix(B,D,sizeX);for(inti=0;i(D);}还有一次是通过使用SSE函数。为此,我创建了两个函数:templatevoidSSE_vectormult(T*A,T*B,intsize){__m128da;__m128db;__m128dc;#ifdeflinuxdoubleA2[2],B2[2],C[2]__