草庐IT

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++ - 使用 AVX2 在程序集 x86_64 中添加两个 vector 加上技术说明

我在这里做错了什么?我得到4个零而不是:2468我也很想修改我的.asm函数,以便运行更长的vector,因为在这里我只是使用了一个带有四个元素的vector,这样我就可以在没有SIMD256位寄存器的循环的情况下对这个vector求和。.cpp#include#includeextern"C"double*addVec(double*C,double*A,double*B,size_t&N);intmain(){size_tN=1(finish-start).count().asm.data;C->RCX;A->RDX;B->r8;N->r9.codeaddVecproc;xorrb

c++ - 在现代 x86_64 CPU 上,AVX/SSE 求幂需要多少个时钟周期?

现代x86_64CPU上的AVX/SSE求幂需要多少个时钟周期?我是关于:pow(x,y)=exp(y*log(x))即exp()和log()AVXx86_64指令都需要特定的已知周期数吗?exp():_mm256_exp_ps()日志():_mm256_log_ps()或者循环数可能会根据指数级而变化,是否有最大循环数可以消耗指数? 最佳答案 x86SIMD指令集(即不是x87),至少到AVX2,不包括SIMDexp、log或powpow(x,0.5)除外,它是平方根。然而,有一些SIMD数学库是根据具有这些函数(以及其他函数)的

c++ - AVX2 float 比较并得到 0.0 或 1.0 而不是全 0 或全 1 位

基本上,在生成的vector中,我想为所有输入浮点值>1保存1.0,而为所有输入浮点值floatf[8]={1.2,0.5,1.7,1.9,0.34,22.9,18.6,0.7};floatr[8];//Mustbe{1,0,1,1,0,1,1,0}__m256itmp1=_mm256_cvttps_epi32(_mm256_loadu_ps(f));__m256itmp2=_mm256_cmpgt_epi32(tmp1,_mm256_set1_epi32(1));_mm256_store_ps(r,_mm256_cvtepi32_ps(tmp2));for(inti=0;i但我没有得

c++ - AVX 4 位整数

我需要执行以下操作:w[i]=scale*v[i]+pointscale和point是固定的,而v[]是一个4位整数vector。我需要为任意输入vectorv[]计算w[]并且我想使用AVX内在函数来加速这个过程。但是,v[i]是一个4位整数vector。问题是如何使用内在函数对4位整数执行运算?我可以使用8位整数并以这种方式执行操作,但有没有办法执行以下操作:[a,b]+[c,d]=[a+b,c+d][a,b]*[c,d]=[a*b,c*d](忽略溢出)使用AVX内在函数,其中[...,...]是8位整数,a、b、c、d是4位整数?如果是,是否可以举一个简短的例子来说明它是如何工作

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++ - 防止 GCC 在使用 -mavx 和 -mfma 编译时自动使用 AVX 和 FMA 指令

如何使用AVX和FMA指令禁用自动矢量化?我仍然希望编译器自动使用SSE和SSE2,而不是FMA和AVX。我的代码使用AVX检查其可用性,但GCC在自动矢量化时不这样做。因此,如果我使用-mfma进行编译并在Haswell之前的任何CPU上运行代码,我将得到SIGILL。如何解决这个问题? 最佳答案 您要做的是为每个目标指令集编译不同的目标文件。然后创建一个cpu调度程序,它向CPUID询问可用的指令集,然后跳转到函数的适当版本。我已经在几个不同的问题和答案中对此进行了描述disable-avx2-functions-on-non-

c# - 为什么只有 AVX 的处理器在许多 SIMD 算法方面优于 AVX2 处理器?

我一直在研究C#和C++中SIMD算法的优势,发现在许多情况下,在AVX处理器上使用128位寄存器比在具有AVX2的处理器上使用256位寄存器提供更好的改进,但是我不明白为什么。我所说的改进是指在同一台机器上SIMD算法相对于非SIMD算法的加速。 最佳答案 在AVX处理器上,256位寄存器的上半部分和浮点单元在不执行AVX指令(VEX编码操作码)时由CPU关闭。当代码确实使用AVX指令时,CPU必须为FP单元加电——这大约需要70微秒,在此期间,AVX指令实际上使用128个微操作执行两次。当AVX指令在大约700微秒内未被使用时,

c++ - 在 64 位 x 64 位乘法中使用 Karatsuba 算法真的很高效吗?

我在AVX2上工作,需要计算64位x64位->128位加宽乘法,并以最快的方式获得64位高位部分。由于AVX2没有这样的指令,我使用Karatsuba算法来提高效率和速度是否合理? 最佳答案 没有。在现代架构上,Karatsuba击败教科书乘法的交叉点通常介于8到24个机器字之间(例如,在x86_64上介于512到1536位之间)。对于固定大小,阈值位于该范围的较小端,新的ADCX/ADOX指令可能会使其在标量代码中更进一步,但64x64仍然太小,无法从Karatsuba中受益。 关于c

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)