草庐IT

c++ - shuffle/permute 内在函数如何为 256 位 pd 工作?

我正在努力思考_mm256_shuffle_pd和_mm256_permute_pd内在函数的工作原理。我似乎无法预测其中一项操作的结果。首先,_mm_shuffle_ps一切正常。我得到的结果是我所期望的。例如:floatb[4]={1.12,2.22,3.33,4.44};__m128a=_mm_load_ps(&b[0]);a=_mm_shuffle_ps(a,a,_MM_SHUFFLE(3,0,1,2));_mm_store_ps(&b[0],a);//3.332.221.124.44所以一切都在这里。现在我想用我目前在我的代码中使用的__m256d来尝试这个。据我发现,_mm

c++ - 在 C++ 中使用内在函数检查 nans

我刚开始使用内在函数,但我想编写一个函数,该函数采用4个double计算a>1e-5的vector?std::sqrt(a):0.0我的第一直觉是这样写#include__m256df(__m256da){__m256dis_valid=a>_mm256_set1_pd(1e-5);__m256dsqrt_val=_mm256_sqrt_pd(a);returnis_valid*sqrt_val;}根据gcc.godbolt.com编译为以下内容f(double__vector(4)):vsqrtpdymm1,ymm0vcmpgtpdymm0,ymm0,YMMWORDPTR.LC0[r

c++ - SSE 内在函数 : masking a float and using bitwise and?

基本上这个问题与x86汇编器有关,您有一个数字,您希望使用and将其设置为零或数字本身。.如果你andnumber为负数你会得到number本身,但如果你and它与零你得到零。现在我在使用SSEinstrinsics时遇到的问题是float在二进制中与double不同(或者我弄错了)。无论如何,这是代码,我尝试使用各种float来掩盖第二个和第三个数字(分别为127.0f和99.0f),但没有成功。#include#includevoidprint_4_bit_num(constchar*label,__m128var){float*val=(float*)&var;printf("%

c++ - 在 AVX 上使用 AVX2/AVX512 内在函数编译 C++ 代码

我的生产代码具有针对各种SIMD指令集(包括AVX、AVX2和AVX512)实现的内核。代码可以在目标机器上为目标机器编译,类似./configure--enable-proc=AVXCXXFLAGS="-mavx"。这在公开AVX内在函数的TravisCI上也很有效。我想至少编译AVX2和AVX512版本,以查看是否所有文件都已checkin。但似乎为不同的ISA编译并不那么容易。一个简单的AVX2测试程序:#includeintmain(intargc,char**argv){__m256da;__m256db;__m256dc;_mm256_fnmadd_pd(a,b,c);}在

c++ - std::AVX 内在函数数组

我不知道我对AVX内在函数如何与std::array一起工作的理解是否遗漏了什么,但是当我将两者结合使用时,我遇到了一个奇怪的Clang问题。示例代码:std::arraygen_data(){std::arrayres;res[0]=_mm256_set1_ps(1);returnres;}voidmain(){autov=gen_data();floata[8];_mm256_storeu_ps(a,v[0]);for(size_ti=0;iClang3.5.0的输出(上面的4个float是垃圾数据):11118.82272e-3905.88148e-390GCC4.8.2/4.9

c++ - SSE 和 AVX 内在函数混合

除了SSE-copy,AVX-copyandstd::copyperformance.假设我们需要按以下方式对某些循环进行矢量化:1)通过AVX对第一个循环批处理(乘以8)进行矢量化。2)将循环的剩余部分分成两批。通过SSE向量化4的倍数的批处理。3)通过串行例程处理整个循环的剩余批处理。让我们考虑复制数组的例子:#includetemplatevoidsimd_copy(float*src,float*dest){autosrc_=src;autodest_=dest;//VectorizefirstpartofloopviaAVXfor(;src_!=src+unroll_boun

C++:使用两种内在类型的运算符作为函数对象

我有一个类似vector的类,其中包含"T"类型的对象数组,我想实现4个算术运算符,它们将对每个项目应用运算://Constructorsandotherfunctionsareomittedforbrevity.templateclassVector{public://Addavaluetoeachitem:naiveimplementation.voidoperator+=(constT&){for(inti=0;i因为运算符将包含相同的样板代码(遍历每个元素并应用适当的操作),我想我可以概括它:templateclassVector{public:voidoperator+=(c

c++ - 使用 SSE 内在函数编译一个简单的 c++ 程序

我是SSE说明的新手,我试图从这个网站学习它们:http://www.codeproject.com/Articles/4522/Introduction-to-SSE-Programming我在Ubuntu10.10和IntelCorei7960CPU上使用GCC编译器这是基于我尝试过的文章的代码:对于长度为ARRAY_SIZE的两个数组,它计算fResult[i]=sqrt(fSource1[i]*fSource1[i]+fSource2[i]*fSource2[i])+0.5这是代码#include#include#include#include#include//Contain

c++ - 使用 AVX 内在函数计算具有允许标量值 0、1 和 2 的 vector 的内积

我正在做两列数以万计的内积。这些值只能是0、1或2。因此它们可以存储为字符。如果在带有avx标志的CPU上对计算进行矢量化,我预计它会快~32倍。但问题是乘法会自动将字符转换为整数,即4个字节。因此最多只能获得8倍的速度。能否达到32倍的速度?顺便说一句,我正在使用带有g++5.1的Linux(迄今为止的Fedora22)。 最佳答案 假设您有AVX2(不只是AVX,它只适用于float),那么你可以使用vpmaddubsw指令,它的内在是:__m256i_mm256_maddubs_epi16(__m256ia,__m256ib)

c++ - ICC 中的 -O3 搞乱了内在函数,与 -O1 或 -O2 或相应的手动组装一起使用

这是对thisquestion的跟进.下面的4x4矩阵乘法C=AB的代码在所有优化设置的ICC上都可以正常编译。它在-O1和-O2上正确执行,但在-O3上给出不正确的结果。问题似乎来自_mm256_storeu_pd操作,因为用下面的asm语句替换它(并且只有它)会在执行后给出正确的结果。有什么想法吗?inlinevoidRunIntrinsics_FMA_UnalignedCopy_MultiplyMatrixByMatrix(double*A,double*B,double*C){size_ti;/*theregistersyouuse*/__m256da0,a1,a2,a3,b0