草庐IT

Intrinsics

全部标签

c++ - 加快一些 SSE2 Intrinsics 的颜色转换

我正在尝试执行从YCbCr到BGRA的图像颜色转换(不要问A位,好头疼)。无论如何,这需要尽可能快地执行,所以我使用编译器内部函数编写它以利用SSE2。这是我第一次涉足SIMD领域,我基本上是一个初学者,所以我确信我做的很多事情都是低效的。事实证明,我执行实际颜色转换的算术代码特别慢,Intel的VTune显示它是一个重大瓶颈。那么,有什么方法可以加快以下代码的速度吗?它以32位、一次4个像素完成。我最初尝试以8位、一次16个像素(如上循环)进行计算,但计算导致整数溢出和转换中断。整个过程,包括Inteljpeg解码,对于全高清的单场大约需要14毫秒。如果我能将它降低到至少12毫秒,最

c++ - 无法使用 BitScanForward64

我正在用C++构建一个使用位板(__int64s)的国际象棋引擎,我需要使用BitScanForward64才能进行一些计算。但是当我调用它时,我得到了这个错误:errorC3861:'_BitScanForward64':identifiernotfound我这样包含它:#include#pragmaintrinsic(_BitScanForward64)BitScanForward64也是一样。我在Windows7(64位)上使用VisualStudio11。CPU:英特尔酷睿i7-2600K我之前没有用C++做过很多项目,所以我不知道为什么会这样。请帮忙!

c++ - 击败编译器

我正在尝试使用Intel内在函数来击败编译器优化代码。有时我能做到,有时我不能。我想问题是,为什么我有时可以打败编译器,但有时却不能?我在下面使用英特尔内在函数的operator+=获得了0.006秒的时间(与使用裸C++时的0.009相比),但是使用内在函数的operator+获得了0.07秒的时间,而裸C++只有0.03秒。#include#include#includeclassTimer{LARGE_INTEGERstartTime;doublefFreq;public:Timer(){LARGE_INTEGERfreq;QueryPerformanceFrequency(&f

c++ - 设置 SSE 寄存器中的最后或前 n 位

我如何创建一个__m128i并设置了n个最高有效位(在整个vector中)?我需要它来屏蔽与计算相关的缓冲区部分。如果可能的话,解决方案应该没有分支,但这似乎很难实现我该怎么做? 最佳答案 我将此添加为第二个答案,并将第一个答案留给历史兴趣。看起来你可以用_mm_slli_epi64做一些更有效的事情:#include#include__m128ibit_mask(intn){__m128iv0=_mm_set_epi64x(-1,-(n>64));//ANDmask__m128iv1=_mm_set_epi64x(-(n>64),

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 Intrinsics 和循环展开

我正在尝试优化一些循环并且我已经成功了,但我想知道我是否只做了部分正确的事情。比如说我有这个循环:for(i=0;i将它展开3倍,产生这个:intunroll=(n/4)*4;for(i=0;i现在是SSE翻译等价物:__m128ai_v=_mm_loadu_ps(&a[i]);__m128two_v=_mm_set1_ps(2);__m128ai2_v=_mm_mul_ps(ai_v,two_v);_mm_storeu_ps(&b[i],ai2_v);或者是:__m128ai_v=_mm_loadu_ps(&a[i]);__m128two_v=_mm_set1_ps(2);__m12

c++ - AVX/SSE 回合向下 float 并返回整数 vector ?

有没有办法使用AVX/SSE获取浮点vector、向下舍入并生成整数vector?所有的floor内部方法似乎都产生了一个浮点的最终vector,这很奇怪,因为四舍五入产生了一个整数! 最佳答案 SSE可以从FP转换为整数,您可以选择截断(向零)或当前舍入模式(通常是IEEE默认模式,最接近平局舍入为偶数。像nearbyint(),与round()不同,其中tiebreak是远离0。如果您需要x86上的舍入模式,youhavetoemulateit,perhapswithtruncateasabuildingblock。)相关说明为

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++ - 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