首页
学习
活动
专区
工具
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.1K20
  • 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后相对性能提升减小很多。

    71720

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

    SSE代码,这样就可能存在AVX和SSE代码共存情况,但是几乎可以肯定是,AVX SSE转换延迟是由于传统SSE与没有vzeroupper256位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.2K10

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

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

    1.3K10

    【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.4K11

    【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.1K20

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

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

    13110

    聊聊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),

    92650

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

    执行过程如下图所示: 1、通过1个字节bool类型ret_flags数组来表示是否满足过滤条件,1表示满足条件,0表示不满足 2、AVX2指令集环境下:通过_mm256_loadu_si256封装指令函数加载...256位长度到寄存器,也就是32字节f 3、_mm256_setzero_si256生成256位0all0 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。

    58540

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

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

    90140

    音视频面试题集锦 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 也有不少应用场景。

    51710

    【算法随记七】巧用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.2K20

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

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

    86320
    领券