草庐IT

c++ - 如何使用 SSE 高效地进行 int8/int64 转换?

我正在SSE类型之间实现转换,我发现为SSE4.1之前的目标实现int8->int64扩展转换很麻烦。最直接的实现是:inline__m128iconvert_i8_i64(__m128ia){#ifdef__SSE4_1__return_mm_cvtepi8_epi64(a);#elsea=_mm_unpacklo_epi8(a,a);a=_mm_unpacklo_epi16(a,a);a=_mm_unpacklo_epi32(a,a);return_mm_srai_epi64(a,56);//missinginstrinsic!#endif}但是由于_mm_srai_epi64在A

c++ - SSE 类型的 pow

我使用SSE类型进行了一些显式矢量化计算,例如__m128(在xmmintrin.h等中定义),但现在我需要提高vector的所有元素一些(相同的)力量,即理想情况下我想要类似__m128_mm_pow_ps(__m128,float)的东西,不幸的是它不存在。解决这个问题的最佳方法是什么?我可以存储vector,在每个元素上调用std::pow,然后重新加载它。这是我能做的最好的吗?当自动矢量化代码时,编译器如何实现对std::pow的调用,否则可以很好地矢量化?是否有任何库提供有用的东西?(请注意thisquestion不是重复项,因此肯定没有有用的答案。)

c++ - 对于具有所有相同组件的 SSE vector ,是动态生成还是预先计算?

当我需要执行一个vector操作,其操作数只是广播到每个组件的float时,我应该预先计算__m256还是__m128,然后加载它当我需要它时,或者每次我需要vector时使用_mm_set1_ps将float广播到寄存器?我一直在预先计算非常重要且使用频繁的vector,并即时生成不太重要的vector。但是我真的通过预计算获得了任何速度吗?值得这么麻烦吗?_mm_set1_ps是用一条指令实现的吗?这可能会回答我的问题。 最佳答案 我认为通常最好从代码(例如循环)中分离出SSEvector,并在需要时使用它,假设您注意不要不小心

c++ - SIMD : Why is the SSE RGB to YUV color conversion about the same speed as the c++ implementation?

我刚刚尝试优化RGB到YUV420转换器。使用查找表可以提高速度,就像使用定点算法一样。然而,我期待使用SSE指令获得真正的yield。我的第一次尝试导致代码变慢,并且在链接所有操作之后,它的速度与原始代码大致相同。我的实现是否有问题,或者SSE说明是否不适合手头的任务?部分原始代码如下:#defineRRGB24YUVCI2_000.299#defineRRGB24YUVCI2_010.587#defineRRGB24YUVCI2_020.114#defineRRGB24YUVCI2_10-0.147#defineRRGB24YUVCI2_11-0.289#defineRRGB24Y

c++ - 如何使用 _mm_extract_ps SSE GCC instrinc 函数将十六进制 float 转换为 C/C++ 中的 float

我正在为二维卷积编写SSE代码,但SSE文档非常稀少。我正在使用_mm_dp_ps计算点积并使用_mm_extract_ps获得点积结果,但是_mm_extract_ps返回一个十六进制float,我不知道如何将这个十六进制float转换为常规float。我可以使用__builtin_ia32_vec_ext_v4sf返回一个float但我想保持与其他编译器的兼容性。_mm_extract_ps(__m128__X,constint__N){union{inti;floatf;}__tmp;__tmp.f=__builtin_ia32_vec_ext_v4sf((__v4sf)__X,

c++ - 如何优化一个周期?

我有以下瓶颈功能。typedefunsignedcharbyte;voidCompareArrays(constbyte*p1Start,constbyte*p1End,constbyte*p2,byte*p3){constbyteb1=128-30;constbyteb2=128+30;for(constbyte*p1=p1Start;p1!=p1End;++p1,++p2,++p3){*p3=(*p1我想用SSE2内部函数替换C++代码。我试过_mm_cmpgt_epi8但它使用了签名比较。我需要无符号比较。有什么技巧(SSE、SSE2、SSSE3)可以解决我的问题吗?注意:在这种

c++ - 通过 SSE4 包装器比较字符串

我需要在支持SSE4的机器上快速比较两个字符串。不写汇编插入怎么办?像longlongbitmask=strcmp(char*a,char*b)这样的包装器将是完美的。 最佳答案 您应该使用英特尔SSE内部函数,而不是使用内联汇编。对于字符串比较,您需要SSE4.2内在函数:文档在这里:http://software.intel.com/sites/products/documentation/doclib/stdxe/2013/composerxe/compiler/cpp-mac/GUID-6E9CFDF2-5DF6-42A4-

c++ - 使用 XMM0 寄存器和内存提取(C++ 代码)比仅使用 XMM 寄存器的 ASM 快两倍 - 为什么?

我正在尝试实现一些内联汇编程序(在VisualStudio2012C++代码中)以利用SSE。我想将7个数字相加1e9次,所以我将它们从RAM放置到xmm0到CPU的xmm6寄存器。当我使用以下代码在visualstudio2012中使用内联汇编时:C++代码:for(inti=0;i我的ASM代码:intcount=1000000000;doubleresVal=0.0;//placingvaluestoregister__asm{movsdxmm0,val1;placingvar1inxmm0registermovsdxmm1,val2movsdxmm2,val3movsdxmm3

c++ - 用 sse 累加整数 vector

我试图更改此代码以处理std::vector.floataccumulate(conststd::vector&v){//copythelengthofvandapointertothedataontothelocalstackconstsize_tN=v.size();constfloat*p=(N>0)?&v.front():NULL;__m128mmSum=_mm_setzero_ps();size_ti=0;//unrolledloopthataddsup4elementsatatimefor(;i引用:http://fastcpp.blogspot.com.au/2011/0

c++ - 使用 SSE/AVX 获取存储在 __m256d 中的值的总和

有没有办法获取存储在__m256d变量中的值的总和?我有这个代码。acc=_mm256_add_pd(acc,_mm256_mul_pd(row,vec));//accinthispointcontains{2.0,8.0,18.0,32.0}acc=_mm256_hadd_pd(acc,acc);result[i]=((double*)&acc)[0]+((double*)&acc)[2];此代码有效,但我想用SSE/AVX指令替换它。 最佳答案 看来您正在对输出数组的每个元素进行水平求和。(也许作为matmul的一部分?)这通常