草庐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++ - SIMD C++ 库

我将VisualStudio与DiretXXNA数学库结合使用。现在,我使用GNU编译器集合。给我一个带有良好文档的SIMD数学库。 最佳答案 本征http://eigen.tuxfamily.org/index.php?title=Main_Page它支持开箱即用的SIMD扩展,它有很好的文档记录,它非常灵活,它提供了很多线性代数方法的高质量实现,并且具有所有重载运算符的好处。我已经将它用于多个与科学相关的项目,非常高兴,尤其是在与其他库一起玩过之后。 关于c++-SIMDC++库,我

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++ - 使用 __m256d 寄存器

你如何使用__m256d?假设我想使用IntelAVX指令_mm256_add_pd在具有3-64位double精度组件(x、y和)的简单Vector3类上z).正确的使用方法是什么?由于x、y和z是Vector3类的成员,_我可以在union中使用__m256d变量声明它们吗?unionVector3{struct{doublex,y,z;};__m256d_register;//theIntelregister?};那我可以走了吗Vector3add(constVector3&o){Vector3result;result._register=_mm256_add_pd(_regi

c++ - 打乱 __m256i vector 的元素

我想打乱__m256ivector的元素。并且有一个内在的_mm256_shuffle_epi8做类似的事情,但它不执行跨车道洗牌。如何使用AVX2指令来实现? 最佳答案 有一种方法可以模拟这个操作,但是不是很漂亮:const__m256iK0=_mm256_setr_epi8(0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0

c++ - 在 CUDA 中使用 SIMD 实现位循环运算符

我知道StackOverflow不是用来向其他人询问代码的,但让我来说说。我正在尝试在CUDAC++设备代码中实现一些AES函数。在尝试实现左字节旋转运算符时,我很不安地看到没有原生的SIMDintrisic。所以我开始了一个天真的实现,但是……它很大,虽然我还没有尝试过,但由于昂贵的拆包/包装,它不会很快……所以,有什么办法吗至少有点效率的每字节位循环操作?如果你不想看,这里是代码。__inline____device__uint32_tper_byte_bit_left_rotate(uint32_tinput,uint8_tamount){return((((input&0xFF

c++ - 此功能是否适合 Intel 上的 SIMD?

我正在尝试优化以下函数(稍微简化了一点,但这是我的程序花费大量时间的循环):intf(intlen,unsignedchar*p){inti=0;while(i=32&&p[i]我认为它可以使用vector指令进行优化,但从一些研究来看,SSE似乎不适用于在字节级别工作。该程序仅针对OSX上的64位IntelCPU。是否有一个我没有看到的聪明的bit-twiddling技巧可以让我一次在64位上工作?带-O3的llvm没有做任何巧妙的优化。更新:在我的基准测试中,SIMD代码通常是最快的(取决于输入的大小),但由于某些原因,使用SIMD的应用程序总体上比使用简单代码或位旋转技巧的速度慢

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++ - 如何将两组 4 条短裤加载到 XMM 寄存器中?

我刚刚开始使用VisualC++2012使用SSE内部函数,我需要一些指导(没有双关语意)。我有两个数组,每个数组包含4个signedshort(因此每个数组都是64位的,总共128个)。我想将一个加载到XMM寄存器的高位,另一个加载到低位。我可以使用SSE内在函数有效地完成这项工作吗?如果是,怎么办? 最佳答案 SSE2:shortA[]={0,1,2,3};shortB[]={4,5,6,7};__m128ia,b,v;a=_mm_loadl_epi64((const__m128i*)A);b=_mm_loadl_epi64((