首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用AVX2将32位值(__m256i)中的8位解压到__m256的最快方法

使用AVX2将32位值(__m256i)中的8位解压到__m256的最快方法是使用_mm256_cvtepi8_epi32函数。该函数可以将__m256i类型的向量中的8位整数值转换为32位整数值,并存储在__m256类型的向量中。

具体步骤如下:

  1. 首先,将__m256i类型的向量中的8位整数值转换为16位整数值,可以使用_mm256_cvtepi8_epi16函数。
  2. 然后,将16位整数值转换为32位整数值,可以使用_mm256_cvtepi16_epi32函数。

以下是示例代码:

代码语言:txt
复制
#include <immintrin.h>

__m256i unpack_8bit_to_32bit(__m256i input) {
    __m256i temp1 = _mm256_cvtepi8_epi16(input);
    __m256i output = _mm256_cvtepi16_epi32(temp1);
    return output;
}

这种方法可以快速将32位值(__m256i)中的8位解压到__m256,并且利用了AVX2指令集的优势,提高了处理速度。

推荐的腾讯云相关产品:腾讯云计算服务(https://cloud.tencent.com/product/cvm)

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

用AVX2指令集优化浮点数组求和

由于AVX2指令集一次要操作多个数据,为了防止访存越界,我们将大小扩展到256的整数倍位比特,也就是32字节的整数倍。...普通数组求和 为了比较性能差异,我们先实现一份普通的数组求和。这里也使用模版。...AVX2指令集求和:单精度浮点(float) 这里我们预开一个avx2的整形变量,每次从数组中取8个32位浮点,加到这个变量上,最后在对这8个32位浮点求和。.../a.out 测试结果 方法 耗时(ms) AVX2加法 单精度 615 普通加法 单精度 2229 AVX2加法 双精度 1237 普通加法 双精度 2426 这里能看到单精度下已经出现了比较明显的误差.../a.out 测试结果 方法 耗时(ms) AVX2加法 32位 244 普通加法 32位 1012 AVX2加法 64位 476 普通加法 64位 1292 我们发现,比起上一次对整形的测试,浮点型在开启

1.2K20
  • 用AVX2指令集优化整形数组求和

    由于AVX2指令集一次要操作多个数据,为了防止访存越界,我们将大小扩展到256的整数倍位比特,也就是32字节的整数倍。...普通数组求和 为了比较性能差异,我们先实现一份普通的数组求和。这里也使用模版。...AVX2指令集求和:32位整形 这里我们预开一个avx2的整形变量,每次从数组中取8个32位整形,加到这个变量上,最后在对这8个32位整形求和。.../a.out 测试结果 方法 耗时(ms) AVX2加法 32位 537 普通加法 32位 1661 AVX2加法 64位 1094 普通加法 64位 1957 可以看出,avx2在32位加法上大致能快.../a.out 测试结果 方法 耗时(ms) AVX2加法 32位 269 普通加法 32位 342 AVX2加法 64位 516 普通加法 64位 750 发现开启O2后相对的性能提升减小很多。

    76720

    AVX图像算法优化系列一: 初步接触AVX。

    SSE代码,这样就可能存在AVX和SSE代码共存的情况,但是几乎可以肯定的是,AVX SSE转换延迟是由于将传统SSE与没有vzeroupper的256位AVX指令混合使用引起的。...AVX无法像SSE一样,独立的使用其体系内的函数完成一个独立的功能,我们去看AVX的指令系统,其很多参数或者返回值都有__m128,__m128i,__m128d这些SSE数据类型的影子,因此AVX必然和...比如说如果我们需要把2个__m256i中的整形数据(8个int32)保存到16个字节中,这肯定是需要使用打包功能的,但是AVX的打包不是按照SSE的方式进行的打包,这个时候我们就可以用_mm256_permutevar8x32...AVX2里还增加了一各比较特别的功能,gather系列指令,这个系列的指令可以从不同的位置收集数据到寄存器中,这个是在SSE中缺失的。...在PC上,一个算法如果需要使用SIMD优化,除了考虑硬件的因素外(现在市面上能看到的硬件不支持AVX或者AVX2的还是有很多在使用的,特备是AVX2,我他妈的去年买的一个机器,CPU居然还只支持AVX,

    1.4K10

    AVX图像算法优化系列二: 使用AVX2指令集加速查表算法。

    普通的查表就是提前建立一个表,然后在执行过程中算法计算出一个索引值,从表中查询索引对应的表值,并赋值给目标地址,比如我们常用的曲线算法如下所示: int IM_Curve_PureC(unsigned...中通过预编译宏作定义 LARGE_INTEGER nBeginTime;//记录开始时的计数器的值 LARGE_INTEGER nEndTime;//记录停止时的计数器的值 double...,或其他各种复杂的计算参与,这个时候用SIMD指令计算这些过程是能起到很大的加速作用的,在我们没有AVX2之前,使用SSE实现时,到了进行查表时通常的做法都是把前通过SSE计算得到的坐标的_m128i元素的每个值使用...最后说明一点,经过在其他一些机器上测试,似乎有些初代即使支持AVX2的CPU,使用这些函数后相应的算法的执行速度反而有下降的可能性,不知道为什么。    ...AVX加速的算法,如果您的硬件中不支持AVX2,可能这个DEMO你无法运行。

    1.5K10

    【AI PC端算法优化】四,一步步将Sobel边缘检测加速22倍

    Sobel边缘检测算法优化第一版 一个比较显然的优化方法是把上述代码中的IM_ClampToByte(sqrtf(GX * GX + GY * GY + 0.0F))利用查表法的技巧来优化,简单改成下面的版本...Sobel边缘检测算法优化第二版 再第一版优化的代码基础上,我们来考虑一下使用SSE来进行算法优化。从代码中可以看到对于灰度图的优化是没有必要的,因为在计算的时候当前像素只和另外两个像素相关: ?...类型,这样就可以用8个SSE变量记录8个连续的像素值,每个像素值用16位的数据来表达,这里可以使用_mm_loadl_epi64配合_mm_unpacklo_epi8来实现,其中_mm_loadl_epi64...Sobel边缘检测算法优化第四版 在SSE中每次只能处理8个结果,自然使用AVX指令集来完成单次16个像素的处理,AVX版本的代码实现如下: unsigned char *RowCopy; unsigned...---- 欢迎关注GiantPandaCV, 在这里你将看到独家的深度学习分享,坚持原创,每天分享我们学习到的新鲜知识。

    1.5K11

    【AI PC端算法优化】三,深入优化RGB转灰度图算法

    所以,这篇文章再次将所有涉及到的优化方法进行汇总,SSE优化相关的原理上一节已经讲得很清楚了,这里就不会再展开了,感兴趣可以查看上篇文章。...RGB转GRAY优化第一版 直接计算复杂度较高,考虑优化可以将小数转为整数,除法变为移位,乘法也变为移位,但是这种方法也会带来一定的精度损失,我们可以根据实际情况选择需要保留的精度位数。...RGB转灰度图优化第七版 在AVX2优化的基础上如果我们将多线程也加入进来,是否会获得提升呢?...这里并非使用OpenMP而是使用C++中的std::async异步并行编程创建多个线程来执行整个任务,代码实现如下: //avx2 + std::async异步编程 void RGB2Y_7(unsigned...优化,一次处理10个像素) 1000 3.576ms 4032x3024 第七版优化(AVX2优化+std::async) 1000 2.626ms 可以看到使用异步并行以及AVX优化后,我们已经将原始算法的速度优化了接近

    1.2K20

    第十二章:向量指令 第一部分

    上述集合中的大多数指令使用两个寄存器操作数;结果被写入其中一个寄存器,而其原始内容将丢失。...向量扩展发展的下一个里程碑是更强大的 256 位 AVX 和 AVX2 指令,它们使用 256 位的 YMM0–YMM15 寄存器。...AVX2 类型系统具有类似的设计:它提供了 __m256(浮点数)、__m256d(双精度浮点数)和__m256i(整数)类型。...(然而,这条指令使用相同的寄存器作为源和目标,所以它更像是“按掩码排列”。)索引由第二个寄存器操作数中的字节值指定。这条指令允许比前面讨论的指令更多样化的排列,使得在许多情况下简化和加速计算成为可能。...ARM NEON 提供了这种类型的指令,它们使用特定大小的元素而不是字节。 AVX 和 AVX2 指令 x86 向量指令的进一步发展标志着 256 位 AVX 和 AVX2 指令的出现。

    18910

    聊聊ClickHouse向量化执行引擎-过滤操作

    他的大小是data数组大小,里面存放布尔值,标记data数组里面哪些数据满足过滤条件,应该筛选出来 3、最终生成一个新的数组res,根据filter数组,对data数组进行筛选,满足条件的拷贝到res数组中...当然,这两种特殊情况经常出现在业务常见中 9、第三中情况是有一部分满足条件,此时是否需要循环64次?有没有进一步的优化方法?...计算出最低位起0的个数index,然后将data_pos[index]拷贝到结果中,即该数组满足条件,最后将index位置为0。...前缀和后缀拷贝的判断: 蓝色框表示的意义:其实是去除前导0后,剩余的都是1,即mask值。也就是从0的索引开始,到64 - leading_zeroes都需要拷贝到结果中。...其利用了以下指令集: AVX512F / AVX512BW AVX/AVX2 SSE2 其中,_mm512_testn_epi8_mask函数功能:计算a和b两个入参值按8位整数逐位与(AND),

    1.1K50

    聊聊Doris向量化执行引擎-过滤操作

    执行过程如下图所示: 1、通过1个字节bool类型的ret_flags数组来表示是否满足过滤条件,1表示满足条件,0表示不满足 2、AVX2指令集环境下:通过_mm256_loadu_si256封装的指令函数加载...256位长度值到寄存器,也就是32字节值f 3、_mm256_setzero_si256生成256位的0值all0 4、_mm256_cmpgt_epi8函数将f和all0每个字节进行并行比较,也就是32...个字节并行比较,f中字节>all0中字节值时,对应结果位为1,否则为0 5、将第4步的值通过_mm256_movemask_epi8转换成int整数mask。...7、mask等于0xffffffff,表示全部满足条件,需要将32个数据的行号保存到数组sel_rowid_idx[]中 8、mask等于其他值时,表示有一部分值满足条件。...这个时候需要特殊处理: 1)通过__builtin_ctzll(mask)计算mask中末尾0的个数bit_pos。

    81040

    【AI PC端算法优化】八,小半径中值滤波的极速优化

    前言 大家应该经常碰到这种需求,那就是使用 或者 这种相对比较小的窗口进行中值滤波,而如果在图像的分辨率比较大的情况下这种操作也是比较耗时的。所以在这种固定场景下定制一个优化算法是有意义的。...普通的3*3中值滤波实现 普通的实现没什么好说,就是直接在窗口区域内遍历寻找中位数即可,这里获取中值直接使用了c语言的qsort。...一个简单的改进 由于排序耗时是非常多的,而这里实际上就是在9个元素中找到中位数,这个其实不需要排序就可以办到,只要我们按照下面的方法进行比较就可以获得中位数。...kernels/NEMedian3x3Kernel.cpp#L113提示时,我们可以知道多个像素的比较是不相关的,(这个地方需要思考为什么不相关,因为我们比较的时候交换是使用临时变量,实际上是没有改变每个位置的像素的位置的...AVX优化 显然,我们可以将SSE版本稍加修改获得AVX指令优化的版本,这样我们就可以一次性处理32个元素了,代码如下: inline void _mm_sort_AB(__m256i &a, __m256i

    91940

    【算法随记七】巧用SIMD指令实现急速的字节流按位反转算法。

    其实这个看下反汇编的代码就可以看到问题所在了,主要是前面的代码使用了寄存器的低位,在32位的环境下不是很有效。   ...注意C语言中默认是传值,所以在函数体内改变了x变量的值,并不会产生其他的什么问题,直接返回这个x不会影响Src中的数据。   ...接下来,我们考虑另外的实现方法,因为byte只有256个不同的数,因此,我们也可以直接用查表的方式来实现,这个表可以实时计算(耗时可以忽视),也可以静态给出,前人已经给给出了,这里我直接贴出来: static...在 c语言实现bit反转的最佳算法-从msb-lsb到lsb-msb一文的回复一栏中,我无意看到ytfhwfnh的回复如下:    我觉得查表法不错,但是表太大了,建议改为半字节为单元的查表。...在此基础上,我们可以将这个函数扩展到使用AVX优化,AVX支持一次性处理32个字节的数据,比SSE还要扩展一倍,并且现在大部分CPU已经支持AVX2了,尝试一下: void Byte_Reverse_10

    1.3K20

    【短道速滑】OpenCV中cvResize函数使用双线性插值缩小图像长宽大小一半时速度飞快(比最近邻还快)之异象解析和自我实现。

    /Imageshop/ 开始原因 今天,一个朋友想使用我的SSE优化Demo里的双线性插值算法,他已经在项目里使用了OpenCV,因此,我就建议他直接使用OpenCV,朋友的程序非常注意效率和实时性(...第三:把插值方法改为其他的方式,比如CV_INTER_CUBIC(三次立方),若其他参数都不变,测试结果为:Use Time:921.885900 ms。...高位使用_mm256_unpackhi_epi8则需要一个__m256i变量,这样会存在重复加载现象的。...使用AVX编写的程序优化后的耗时大约在80ms左右波动,这个已经非常接近OpenCV的速度了,至此,我们有理由相信OpenCV在实现这个的过程中应该也采取了类似我上述的优化方式进行处理(没有仔细的翻OpenCV...那么我们再谈谈为什么这个速度比最近邻插值还要快吧,最近邻算法中,不存在插值,直接在源图像中选择一个坐标位置的点作为新的像素值,在放大时其会出现多行像素相同的特性,这个特性可以用来加快算法执行速度,但是对于缩小

    92120

    音视频面试题集锦 2023.11(1)

    4)转换函数解析 double av_q2d(AVRational a) //将AVRational 对象转换为小数,便于转换 // 将一个时间戳a从时基bq转换到时基cq下 int64_t av_rescale_q...iOS 判断一个视频是否是 HDR 视频的方法:判断是否带有 HDR 特征的 track 即可,如下: NSArray *hdrTracks = [asset tracksWithMediaCharacteristic...下面是一个 SIMD 的示例:向量化乘法 假设有两个数组 A 和 B,我们想要将它们的对应元素相乘,并将结果存储在另一个数组 C 中,使用 SIMD 指令,可以一次处理多个元素,提高计算效率。...A __m256 b = _mm256_load_ps(B + i); // 加载 8 个单精度浮点数到向量寄存器 B __m256 result = _mm256_mul_ps...通过合理地使用 SIMD 优化,可以显著提高程序的性能。 在音视频开发中,SIMD 也有不少的应用场景。

    63210
    领券