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

将__m256i寄存器转换为uint64_t位掩码,使得每个字节值处的值是输出中的设置位

__m256i是AVX2指令集中的一种256位寄存器类型,用于存储256位的数据。uint64_t是C/C++中的一种无符号64位整数类型。将__m256i寄存器转换为uint64_t位掩码的过程可以通过以下步骤实现:

  1. 将__m256i寄存器中的数据按字节拆分为8个uint32_t类型的数据。
  2. 对每个uint32_t类型的数据进行位运算,将每个字节的值转换为对应的位掩码。可以使用位掩码生成函数,如_mm256_movemask_epi8
  3. 将8个uint32_t类型的位掩码合并为一个uint64_t类型的位掩码。可以使用位运算符进行合并操作。

以下是一个示例代码,演示了如何将__m256i寄存器转换为uint64_t位掩码:

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

uint64_t convertMask(__m256i reg) {
    // 将__m256i寄存器中的数据按字节拆分为8个uint32_t类型的数据
    uint32_t mask[8];
    _mm256_storeu_si256((__m256i*)mask, reg);

    // 对每个uint32_t类型的数据进行位运算,将每个字节的值转换为对应的位掩码
    uint32_t byteMask = 0;
    for (int i = 0; i < 8; i++) {
        byteMask |= (mask[i] != 0) << i;
    }

    // 将8个uint32_t类型的位掩码合并为一个uint64_t类型的位掩码
    uint64_t result = byteMask;
    result |= (uint64_t)byteMask << 32;

    return result;
}

int main() {
    __m256i reg = _mm256_set_epi8(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

    uint64_t mask = convertMask(reg);
    // 输出位掩码的值
    printf("%016llx\n", mask);

    return 0;
}

这段代码中,我们使用AVX2指令集中的_mm256_storeu_si256函数将__m256i寄存器中的数据存储到一个uint32_t数组中。然后,通过对每个uint32_t类型的数据进行位运算,将每个字节的值转换为对应的位掩码。最后,将8个uint32_t类型的位掩码合并为一个uint64_t类型的位掩码。

请注意,这只是一个示例代码,具体的实现可能因编译器和平台而异。在实际使用中,建议根据具体的需求和环境进行适当的调整和优化。

推荐的腾讯云相关产品和产品介绍链接地址:

  • 腾讯云计算产品:https://cloud.tencent.com/product
  • 腾讯云云原生产品:https://cloud.tencent.com/solution/cloud-native
  • 腾讯云数据库产品:https://cloud.tencent.com/product/cdb
  • 腾讯云服务器产品:https://cloud.tencent.com/product/cvm
  • 腾讯云人工智能产品:https://cloud.tencent.com/product/ai
  • 腾讯云物联网产品:https://cloud.tencent.com/product/iot
  • 腾讯云移动开发产品:https://cloud.tencent.com/product/mobile
  • 腾讯云存储产品:https://cloud.tencent.com/product/cos
  • 腾讯云区块链产品:https://cloud.tencent.com/product/baas
  • 腾讯云元宇宙产品:https://cloud.tencent.com/product/vr
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

单核M1 CPU上实现FP32 1.5 TFlops算力?这是一份代码指南

以下用于加载或存储规格: 最小与完整 AVX512 寄存器一样宽。 但这些从哪里加载或存储?显然,这样大小会很快用完整个 NEON 寄存器文件。...不过 AMX 有一个单独寄存器文件,这有些奇怪。 寄存器分为三组:X、Y 和 Z。对每个指令,X 和 Y 组保存输入,Z 组保存输出。 如我们所见,X 和 Y 相当大。二者之间有一个完整 KB。...以同样方式 reset_z 编码为掩码寄存器地址也编码在传递给 AMX_* 参数。指向 A 和 B 指针最多只能使用 56 ,因此苹果工程师信息存储在其他 8 。...我们只是意外将其全部设置为 0。因此,在本例,对 X 和 Y 我们寄存器置 “0”。 Z 寄存器存储到内存代码有点复杂,因为我们只填充了第一列。...接下来问题从内存中加载效率很低。我们其实可以一次加载  128 个字节,但上面的代码只能加载 64 个字节。类似地,可以加载到其他寄存器,不必每次都加载到相同寄存器

54620

如何更快地string转换成intlong

(baseline 方案在底层,相当于数值放进来了寄存器,所以命名成了 BM_mov) 下面给出评测代码不是那么地关键,只是为了给大家展示评测如何运行。...我们可以每个相邻数字组合成一对,然后每对数字继续组合成一组四个,依此类推,直到我们得到整个整数。...使用 bitmasking 另一好处在于,我们不用减去 '0' ,因为掩码副作用,使得我们正好可以省略这一步。...让我们先设置 16 个字节每一个数字: inline std::uint64_t parse_16_chars(const char* string) noexcept { auto chunk...这些 SIMD 函数与我们使用掩码技巧所做操作完全一样——它们采用同一个宽寄存器,将其解释为一个由较小整数组成向量,每个乘以一个特定乘数,然后将相邻结果相加到一个更宽整数向量

1.4K30

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

为此,《mm_loadl_epi64(__m128i* addr)指令从 RAM 检索以 addr 为起始地址连续 64 位数组,并将其写入选定向量寄存器最低有效半部分,最高有效半部分设置为零...经常使用_mm_setzero_si128()指令目标寄存器所有设置为零,通过使用 XOR 操作实现,其中两个操作数相同。 逻辑指令与比较指令密切相关。...图 5:按掩码复制 多个 x86 和 ARM 向量指令实现了按掩码复制(图 5)。考虑有一个源数组、一个目标数组和一个与目标大小相同索引数组,索引数组每个元素对应于目标数组一个元素。...(然而,这条指令使用相同寄存器作为源和目标,所以它更像是“按掩码排列”。)索引由第二个寄存器操作数字节指定。这条指令允许比前面讨论指令更多样化排列,使得在许多情况下简化和加速计算成为可能。...假设 a 寄存器字节具有 a0..a15,b 寄存器字节具有 b0..b15。

10910

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

大家好,又见面了,我你们朋友全栈君。 用AVX2指令集优化整形数组求和 一、AVX2指令集介绍 二、代码实现 0. 数据生成 1. 普通数组求和 2. AVX2指令集求和:32整形 3....Intel® Intrinsics Guide 我们本次要用到指令有 __m256i _mm256_add_epi32(__m256i a, __m256i b), __m256i _mm256_add_epi64...等 它们可以一次取256内存,并按32/64一个整形进行加法运算。...由于AVX2指令集一次要操作多个数据,为了防止访存越界,我们大小扩展到256整数倍比特,也就是32字节整数倍。...AVX2指令集求和:32整形 这里我们预开一个avx2整形变量,每次从数组取8个32整形,加到这个变量上,最后在对这8个32整形求和。

68920

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

大家好,又见面了,我你们朋友全栈君。 用AVX2指令集优化浮点数组求和 一、AVX2指令集介绍 二、代码实现 0. 数据生成 1. 普通数组求和 2....Intel® Intrinsics Guide 我们本次要用到指令有 __m256i _mm256_add_pd(__m256i a, __m256i b), __m256i _mm256_add_ps...由于AVX2指令集一次要操作多个数据,为了防止访存越界,我们大小扩展到256整数倍比特,也就是32字节整数倍。...AVX2指令集求和:单精度浮点(float) 这里我们预开一个avx2整形变量,每次从数组取8个32浮点,加到这个变量上,最后在对这8个32浮点求和。...有可能CPU内浮点加法器少于整形加法器,导致O2优化乱序执行时优化效果不如整形理想。 AVX2指令集可能针对浮点运算有专门优化,使得浮点运算性能和整形运算更为接近。

1K20

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

SSE代码,这样就可能存在AVX和SSE代码共存情况,但是几乎可以肯定,AVX SSE转换延迟由于传统SSE与没有vzeroupper256AVX指令混合使用引起。...其中数据计算类、类型转换类、数据加载保存类、数值比较类、大部分移位类基本上直接扩展,这些比较典型比如  加减陈、最大、最小、平均值、8为16,16为32、数据大小比较等等。   ...这样操作初步看起来对于SSE代码AVX个灾难,因为其实我们知道特别是shuffle,SSE精华,这样的话,如果用到了shuffle类函数,所有的代码都要从算法层次上更改。...比如说如果我们需要把2个__m256i整形数据(8个int32)保存到16个字节,这肯定是需要使用打包功能,但是AVX打包不是按照SSE方式进行打包,这个时候我们就可以用_mm256_permutevar8x32...AVX2里还增加了一各比较特别的功能,gather系列指令,这个系列指令可以从不同位置收集数据到寄存器,这个在SSE缺失

1.2K10

【AI PC端算法优化】一,一步步优化RGB灰度图算法

_ss表示只操作向量第一个单精度数据。_si128表示操作向量寄存器第一个128有符号整型数据。...「算法原理」: 首先,代码一次性处理12个像素,每个像素有BGR三个,我们BGR序列写出来看看: ❝B1 G1 R1 B2 G2 R2 B3 G3 R3 B4 G4 R4 B5...接下来我们来分析以下一些关键指令: _mm_loadu_si128就是把之后「8个16个字节(short)」 数据读入到一个SSE寄存器,注意由于任意位置图像数据内存地址肯定不可能都满足SIMD16...举个例子,这里第一个变量位置为什么「0,6,12」呢,因为最后计算得到变量高位没有信息,我们只使用了低8,而sse内存排布大概这样子: ?...所以指令集优化确实是有用并且值得研究,后面持续输出,为大家带来更多优化实例和优化技巧。 11.

1.5K20

Rust实战系列-深入理解数据

(1)提取这些二进制(deconstruct_f32() 函数) (2)每个从二进制换为真实数值 (3)计算,科学计数法表示数字变换为普通数字 第一个任务每个从二进制中提取出来... mantissa 默认设置为 1 提供具体类型,确保由掩码产生二进制序列有效 每次迭代,产生一个提取指定二进制(从右往左为 0...23 掩码 结果非 0 时,意味着对应二进制为...当指数为 0(0b00000000)时,尾数零用 0 表示,每个非零第 24 个二进制换为 0.0。...表示“寄存器1加到寄存器0操作码 0x8024 加载到内存,0x8024 表示“寄存器2加到寄存器0操作码 0x8034 加载到内存,0x8034 表示“寄存器3...函数 操作码 0x0000:隐式执行 HALT 操作码 0x8014:寄存器 1 累加到寄存器 0 运算代码 0x8014:寄存器 1 累加到寄存器 0 操作码 0x00EE:

1.2K20

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

mask,这样每个filter数组项占用一个比特 8、有两种特殊情况:1)mask 64比特都是1,本次循环中,64个data项都应该拷贝到res。...11、最高1比特数据项拷贝后,需要将它置成0,这里有2个比较高效方法blsr函数:一个_blsr_u64指令,另一个mask & (mask-1) 12、循环设置最高1比特,直到mask中所有比特都为...计算出最低位起0个数index,然后data_pos[index]拷贝到结果,即该数组满足条件,最后index位置为0。...prefix_to_copy : 64 - prefix_to_copy;//需要拷贝个数 } 效果如下图所示: 64字节转换成64掩码计算函数Bytes64MaskToBits64Mask实现也很有讲究...产生中间8,如果中间为0,则在结果掩码k设置相应: FOR j := 0 to 63 i := j*8 k[j] := ((a[i+7:i] AND b[i+7:i]) == 0) ?

84850

第十三章 向量指令 第二部分:矢量化

与示例5相比,向量化实现变得更加复杂,因为dst必须从8换为有符号或无符号16。还需要实现反向转换为带有上限和下限无符号8。...要将16换为无符号8,可以使用_mm_packus_epi16指令,该指令两个矢量寄存器内容打包为一个。对于任何在0之外16项…255范围内,它也截断到该范围。...16元素设置为相同。...因此,我们使用_mm_shuffle_epi32交换sum寄存器最低有效和最高有效,并将结果存储在x0寄存器。通过x0和sum寄存器加在一起,我们得到了后者最低有效32最终结果。...获得平方差最方便方法_mm_madd_epi16指令,该指令16数据直接转换为32,并执行一些所需加法。当循环完成时,只需要将sum寄存器中所有元素相加,如例10所示。

13310

.NET8 硬件加速指令支持

然后它使用这个分类从表格读取 4 (QNaN 0,读取 0..3;负数 6,读取 24..27)。表格这 4 则决定了结果会是什么。...这使得现有算法扩展到 256 变得简单,因为你实际上做了两次相同事情。然而,当你真的需要将整个向量作为一个整体来考虑时,这使得其他算法工作变得更加困难。...确实有一些指令允许你在整个 256 向量重新排列数据,但它们通常要么在如何重新排列数据方面有限制,要么在它们支持类型上有限制(完全随机排列字节元素一个明显缺失支持例子)。...这实际上做从 result1 ,对应在 cond 1,否则从 result2 取对应(当在 cond 0)。...对于这样情况,Arm64 将有相同行为,而 x64 只有在最高有效设置时才有相同行为 获取掩码第一个/最后一个匹配索引 获取掩码匹配数量 确定是否存在任何匹配 允许非确定性行为,例如

24810

STM32之CAN通信

前面介绍CAN协议介绍到,在CAN总线网络,总线上所有设备都获取总线数据帧ID,如果自己关注ID,则继续获取数据段内容。当总线上报文过多时,每个CAN设备频繁获取报文,消耗比较大。...ID,才能通过筛选器,存入FIFO; 掩码模式:此时两个寄存器作为标识符寄存器掩码寄存器,根据掩码寄存器指定哪些与标识符寄存器匹配ID,才能通过筛选器,存入FIFO; 举个例子,如表 23.1.3...首先设置筛选器组0于32掩码模式,ID为0x0,掩码为0x7FC,结果筛选出0x0-0x3。接着设置筛选器组1于32列表模式,列表两个ID分别设为0x04和0x05。...32; 36~37行:设置ID高低字节,这里设置ID为0; 38~39行:设置掩码高低字节,这里设置掩码为0,则没有做任何过滤; 40行:设置本筛选器消息存储在哪个FIFO(接收FIFO共有两个...32; 36~37行:设置ID高低字节,这里设置ID为0; 38~39行:设置掩码高低字节,这里设置掩码为0,则没有做任何过滤; 40行:设置本筛选器消息存储在哪个FIFO(接收FIFO共有两个

1.5K10

第3章-图形处理单元-3.3-可编程着色器阶段

DirectXHLSL可以编译为虚拟机字节码,也称为中间语言(IL或DXIL),以提供硬件独立性。"中间"表示还可以允许离线编译和存储着色器程序。该中间语言由驱动程序转换为特定GPUISA。...整数最常用于表示计数器、索引或掩码。还支持聚合数据类型,例如结构体、数组和矩阵。 绘制命令调用图形API来绘制一组图元,从而使得图形管线执行并运行其着色器。...例如,像素着色器可以光源颜色作为统一(uniform)提供,并且三角形表面的位置每个像素都会发生变化,因此也会发生变化。...纹理一种特殊统一(uniform)输入,曾经应用于表面的彩色图像,但现在可以将其视为任何大型数据数组。 底层虚拟机为不同类型输入和输出提供特殊寄存器。...用于uniform可用常量寄存器数量远大于可用于varying输入或输出那些寄存器。发生这种情况是因为需要为每个顶点或像素单独存储不同输入和输出,因此需要多少个自然有限制

94420

Linux系统驱动之硬件_IMX6ULLLCD控制器

,在每个半字内部放换字节, 即0x12345678换为0x34127856 [13:12] CSC_DATA_SWIZZLE R/W 显存数据被传入LCD控制器内部并被转换为24BPP后,在它被转给...,在每个半字内部放换字节, 即0x12345678换为0x34127856 [11:10] LCD_DATABUS_WIDTH R/W LCD数据总线宽度,就是对外输出LCD数据宽, 0x0:16...域 名 读写 描述 [19:16] BYTE_PACKING_FORMAT R/W 用来表示一个32word,哪些字节有效,即哪些字节用来表示颜色。...bit16、17、18、19分别对应byte0、1、2、3;某位为1,就表示对应字节有效。 默认0xf,表示32word,所有字节都有效。...2.10 LCDIF_NEXT_BUF寄存器 域 名 读写 描述 [31:0] ADDR R/W 下一帧在显存地址 LCD控制器传输完当前帧后,会把LCDIF_NEXT_BUF寄存器复制到

1.3K20

Intel 内部指令 — AVX和AVX2学习笔记

大家好,又见面了,我你们朋友全栈君。...8个float类型数字向量 __m256d 包含4个double类型数字向量 __m256i 包含若干个整型数字向量 每一种类型,从2个下划线开头,接一个m,然后vector长度。...256向量 _mm256_setr_ps/pd 用8个float或者4个double置顺序初始化向量 _mm256_setr_epi8/epi16/epi32/epi64x 用若干个整形数置顺序初始化向量.../pd 根据掩码加载256浮点向量部分 (2)_mm_maskload_epi32/64 根据掩码加载128整形向量部分 (2)_mm256_maskload_epi32/64 根据掩码加载256..._mm256_permute2f128_si256 基于8控制从两个输入向量中选择128块 _mm_permutevar_ps/pd _mm256_permutevar_ps/pd 根据整数向量从输入向量中选择元素

2.3K40

论文研读-SIMD系列-基于分区SIMD处理及在列存数据库系统应用

图1c输入数组逻辑分块,提出stride-block风格。本例,定义步长为2,块大小为8。这就意味着,每个大小为8块,需要运行2次大小为4SIMD寄存器。...Filter算子首先将谓词广播到SIMD寄存器,然后每个迭代filter列B数据加载到SIMD寄存器,并与谓词向量寄存器进行比较。...处理了一个完整向量后,操作符返回这个SIMD寄存器。然后将相同寄存器用作每个后续调用输入,并在每个处理向量中进行修改。处理完所有数据时,sum汇总到SIMD寄存器并返回。...这个SIMD寄存器包含所有设置0或者1.因此可以掩码先广播到SIMD寄存器,由lane-id和二进制与移位。这样,SIMD寄存器每个通道包含对应1或者0。...SIMD寄存器所有元素都减少了1,其中−1等于设置为1所有。最后,所得到SIMD寄存器取反,并与数据SIMD寄存器进行与操作。

36140

程序整数

16bit立即数搬移到寄存器低16,并将寄存器高16bit清零 指令movt16bit立即数搬移到寄存器高16 ?...函数printf 下面的代码输出为-12345 4294954951,其中十进制4294954951换为十六进制为0x‭ffffcfc7‬。...用来判断比较结果指令不同,左侧ble,右侧bcs。这两个指令都是根据cmp设置状态寄存器flag做判断,看哪个数大,哪个数小。 看来编译器才关心数据类型,它根据不同类型使用不同指令。...也就是说在符号扩展时候,保持不变。 从下面的汇编代码我们可以看到: 变量a赋值0xff 变量b赋值时候用ldrsb命令把a读到寄存器r3,然后再存储到对应内存。...strb寄存器所存储数值最低位一字节写到内存;strh寄存器所存储数值最低位二字节写到内存,并且保持这二字节相对顺序不变。

1.3K20

论文研读-SIMD系列-利用BMI指令进行选择下推

PEXT根据r/m32指定掩码r32b比特传输到r32a低比特。 PEXT:其实是根据掩码寄存器存入目标寄存器。源寄存器高位放到目标寄存器低位。目前寄存器连续存放。...2)PDEP :格式:PDEP r32a, r32b, r/m32,使用r/m32掩码r32b低比特传输并散列到r32a: PDEP:其实是根据掩码寄存器存入目标寄存器。...-64.html 4、BIT-PARALLEL SELECT算子 SELECT算子一个字节数组(由k组成)和一个n选择bitmap作为输入。...选择bitmap为1对应提取出来,并拷贝到连续输出字节数组,也就是输出字节数组仅包含满足条件,并且连续。...考虑到,每个通常仅有几位,比处理器word(比如64)要小,这样简单处理并不能充分利用处理器word宽度,因此浪费了处理器可用并行性。

47550
领券