草庐IT

c++ - 为什么 _umul128 的工作速度比 mul128x64x2 函数的标量代码慢?

我第二次尝试实现快速mul128x64x2功能。FirsttimeIaskthequestion与_umul128MSVC版本没有比较。现在我做了这样的比较,我得到的结果表明_umul128函数比原生标量和手工simdAVX1.0代码慢。在我的测试代码下面:#include#include#include#include#include#pragmaintrinsic(_umul128)constexpruint32_tLOW[4]={4294967295u,0u,4294967295u,0u};__forceinlinevoidmultiply128x128(constuint32_

c++ - 清除 __m128i 的高位字节

如何清除__m128i的16-i高位字节?我试过了;它有效,但我想知道是否有更好(更短、更快)的方法:inti=...//014)?-1:0,(i>13)?-1:0,(i>12)?-1:0,(i>11)?-1:0,(i>10)?-1:0,(i>9)?-1:0,(i>8)?-1:0,(i>7)?-1:0,(i>6)?-1:0,(i>5)?-1:0,(i>4)?-1:0,(i>3)?-1:0,(i>2)?-1:0,(i>1)?-1:0,-1);x=_mm_and_si128(x,mask); 最佳答案 我尝试了几种不同的实现方法,并在早

c++ - 什么是非时间流加载固有 (_mm256_stream_load_si256) 的浮点 (__m256d) 版本?

在AVX/AVX2中我只能找到_mm256_stream_load_si256(),用于__m256i。没有办法流式加载__m256d吗?为什么?(我想在不污染CPU缓存的情况下加载它)做下面的(aggressivecasting)有什么障碍吗?__m256d*pDest=/*...*/;__m256d*pSrc=/*...*/;/*...*/const__m256iiWeight=_mm256_stream_load_si256(reinterpret_cast(pSrc));const__m256dprior=_mm256_div_pd(*reinterpret_cast(&iWe

c++ - 使用 `__m256i` 中的值高效访问数组 - SIMD

关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭5年前。Improvethisquestion比方说,我有2个变量__m256i,名为rows和cols,它们里面的值是:rows:0,2,7,5,7,2,3,0cols:1,2,7,5,7,2,2,6现在,这些值代表8个点的x和y位置,因此,在这种情况下,我会有这些点:p0:[0,1],p1:[2,2],p2:[7,7],p3:[5,5]p4:[7,7],p5:[2,2],p6:[3,2],p7:[0,6]我还有一个名为lut的数组,它将具

c++ - openMP 的 SIMD 构造是否需要特定类型的硬件?

https://bisqwit.iki.fi/story/howto/openmp/Thesimdconstruct(OpenMP4.0+)OpenMP4.0addedexplicitSIMDparallelism(Single-Instruction,Multiple-Data).SIMDmeansthatmultiplecalculationswillbeperformedsimultaneouslybytheprocessor,usingspecialinstructionsthatperformthesamecalculationtomultiplevaluesatonce.T

c++ - Add+Mul 使用 Intrinsics 变得更慢——我哪里错了?

有这个数组:alignas(16)doublec[voiceSize][blockSize];这是我要优化的功能:inlinevoidProcess(intvoiceIndex,intblockSize){double*pC=c[voiceIndex];doublevalue=start+step*delta;doubledeltaValue=rate*delta;for(intsampleIndex=0;sampleIndex这是我的内在函数(SSE2)尝试:inlinevoidProcess(intvoiceIndex,intblockSize){double*pC=c[voice

c++ - 同时使用多个 SIMD 指令集的好处

我正在编写一个高度并行的多线程应用程序。我已经编写了一个SSE加速线程类。如果我要编写一个MMX加速线程类,然后同时运行两者(每个核心一个SSE线程和一个MMX线程),性能会显着提高吗?我认为此设置有助于隐藏内存延迟,但我想在开始投入时间之前先确定一下。 最佳答案 SSE和MMX指令集在CPU中共享同一组vector处理执行单元。因此,运行一个SSE线程和一个MMX线程时,每个线程将拥有相同的可用资源,就像运行两个SSE线程(或两个MMX线程)一样。唯一的区别是存在于SSE而不是MMX中的指令(因为SSE是MMX的扩展)。但在那种情

c++ - 从连续的单词序列中提取任意范围的位的最有效方法是什么?

假设我们有一个std::vector,或任何其他序列容器(有时是双端队列),它存储uint64_t元素。现在,让我们将此vector视为size()*64的序列连续位。我需要找到由给定[begin,end)中的位组成的单词范围,鉴于end-begin所以它适合一个词。我现在的解决方案是找到其部分将构成结果的两个词,并将它们分别屏蔽和组合。因为我需要它尽可能高效,所以我尝试在没有任何if的情况下编写所有代码。分支不会导致分支预测错误,因此例如,当整个范围适合一个词或跨越两个词时,代码在两种情况下都有效,而不采用不同的路径。为此,我需要对这些shiftl进行编码和shiftr函数,除了将单

c++ - SSE版本的差平方和算法的累积计算误差

我正在尝试优化以下代码(两个数组的平方差之和):inlinefloatSquare(floatvalue){returnvalue*value;}floatSquaredDifferenceSum(constfloat*a,constfloat*b,size_tsize){floatsum=0;for(size_ti=0;i所以我使用CPU的SSE指令进行了优化:inlinevoidSquaredDifferenceSum(constfloat*a,constfloat*b,size_ti,__m128&sum){__m128_a=_mm_loadu_ps(a+i);__m128_b=

c++ - 两个8位数组协方差的快速实现

我需要比较大量相似的小尺寸图片(最大200x200)。所以我尝试实现SSIM(结构相似性参见https://en.wikipedia.org/wiki/Structural_similarity)算法。SSIM需要计算两个8位灰度图像的协方差。一个简单的实现如下所示:floatSigmaXY(constuint8_t*x,constuint8_t*y,size_tsize,floataverageX,floataverageY){floatsum=0;for(size_ti=0;i但是性能很差。所以我希望用SIMD或者CUDA来改进一下(听说可以)。不幸的是,我没有这样做的经验。它看起