筛子排序(SieveSort) - 4

现在,我们已经可以用筛子排序法给256个32位整数排序了。

目前看来AVX-512还是挺给力的。

下一步,让我们试试为4K(4096)个整数排序。

为什么是4096个?因为它是256的16倍。为什么要选择16倍?因为那个指令就是从16个32位整数里面选择最大的或者最小的。

不难发现,先前是16,或者是16乘以16,我们用一条AVX-512指令或者其二级模拟,就可以一次性获得16个或者是256个整数中的最大和最小值。于是我们可以大胆的把两个数值放在结果的两端。除非我们继续研发一种16乘以16乘以16也就是16的立方次那么多(也就是4096)个整数中寻找最大值或者最小值的方法,否则我们就无法一次获得两个值。实际上一次获得两个值在这个条件下已经变得不再重要了。我们只需要不断的获得下一个最小值即可。

4096个数,就是16个256个数。不难想到,具体做法就是:256个数一组进行排序,一共完成16组,然后再对这16组进行排序(不是直接串联)。而i9-11900K本身就支持16线程。可见如果我们用多线程来排序,16组就可以在16核(也可能是HT)上同时排序,速度会快很多。所以我们把输入的数组分成16段,反正也是4096,分成16段刚好256一段,然后把这些段分给先前给出的256排序能力的函数。并且引入omp来实现并行运行(记得打开编译开关)。

#pragma omp parallel for
for(int i = 0;i<16;i++){....
}

考虑到有可能不用omp或者没有omp可用,加上一个omp_depth选项。于是得到如下代码,

const size_t _4K = _256 << 4;
void sieve_sort_4K(uint32_t result[_4K], uint32_t a[_4K], int omp_depth = 1) {__m512i idx = zero;for (int i = 0; i < 16; i++) {idx.m512i_u32[i] = i << 8;}if (omp_depth > 0) {
#pragma omp parallel forfor (int i = 0; i < 16; i++) {uint32_t* pa = a + ((size_t)i << 8);sieve_sort_256_dual(pa);}}else {for (int i = 0; i < 16; i++) {uint32_t* pa = a + ((size_t)i << 8);sieve_sort_256_dual(pa);}}__mmask16 mask = 0x0ffff;for (int i = 0; i < _4K; i++) {__m512i values = _mm512_mask_i32gather_epi32(zero, mask, idx, a, sizeof(uint32_t));int p = sieve_get_min_index(mask, result[i], values);idx.m512i_u32[p]++;if ((idx.m512i_u32[p] & 0xff) == 0) {mask &= ~(1 << p);}}
}

最开始for初始化了一个索引向量,这和最后的一部分相关。中间就是omp(或者不使用omp)并行处理256段拆分的实现。最后一部分就是这里最特殊的一部分了。

__mmask16 mask = 0x0ffff;for (int i = 0; i < _4K; i++) {__m512i values = _mm512_mask_i32gather_epi32(zero, mask, idx, a, sizeof(uint32_t));int p = sieve_get_min_index(mask, result[i], values);idx.m512i_u32[p]++;if ((idx.m512i_u32[p] & 0xff) == 0) {mask &= ~(1 << p);}
}

intrinsic形式_mm512_mask_i32gather_epi32为的AVX-512指令,具有一种收集数据的能力。

它可以把相距甚远的16个数据打包装入一个512位寄存器。mask指明那个数据是否要收集,若不收集就是zero对应的位(就是0),若要收集,就从数组a的,idx的mask指明的那个下标取数据。我们将整个4K数据分成了16段,每一段256个数据。而这个指令就实现了跨256个数据取数的功能。

取到之后,再判断其中最小的,并获得最小的在16个数据中的相对位置p。

int sieve_get_min_index(__mmask16 mask, uint32_t& _min, __m512i a) {return get_lsb_index(_mm512_mask_cmpeq_epi32_mask(mask, a, _mm512_set1_epi32(_min = _mm512_mask_reduce_min_epu32(mask, a))));
}

返回值可能是多值,当前版本我们只取最小的(lsb),这一点可以改进。

有了这个位置,和这个结果,结果就送入结果数组,而对应的位置向量的分量要推进到下一个位置。

	idx.m512i_u32[p]++;

   当这个位置到达尾部(256),就将这个分量掩掉,以后不再从这个位置收集数据。
 

	if ((idx.m512i_u32[p] & 0xff) == 0) {mask &= ~(1 << p);}

不知道你有没有拆过毛衣。

拆毛衣是个很解压的活动,只是一直拽,线就一直解开,整个过程完全丝滑无阻。

这个算法的这一步就像是拆毛衣:16个数据段,每一个256个数据,都已经准备好了。16个指针指向它们各自的开头,先从各自取1个数,一共16个,找出最小的,当作最小值,获取最小值的那个数据段的指针向前移动一个位置。再取16个,再比较出最小值,然后获得最小值的向前移动一个位置。一个数据段取完了,指针就不动了,以后也不再从这个数据段取数,一直到所有的数据段的所有数据都被取完为止。

容易证明(或者根本不需要证明),这样获得的数一定是良好排序的。

PS: 一会把现在的单步移动转换成并行移动。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1543703.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

护理陪护小程序|陪护系统||陪护系统开发

在当今社会&#xff0c;随着人口老龄化的加剧和家庭结构的变化&#xff0c;护理与陪护服务的需求日益增长。为了更好地满足这一市场需求&#xff0c;并提升服务效率与质量&#xff0c;护理陪护小程序应运而生。这类小程序不仅为用户提供了便捷、高效的服务预约与管理平台&#…

828华为云征文 | 云服务器Flexus X实例,Docker集成搭建Redis集群

828华为云征文 | 云服务器Flexus X实例&#xff0c;Docker集成搭建Redis集群 Redis 集群是一种分布式的 Redis 解决方案&#xff0c;能够在多个节点之间分片存储数据&#xff0c;实现水平扩展和高可用性。与传统的主从架构不同&#xff0c;Redis 集群支持数据自动分片、主节点故…

J Transl Med结肠癌分子分型+简单实验

目录 技术路线 实验设计&#xff08;药物敏感性&#xff09; 亮点 方法 从 TCGA 和 GEO 数据库下载大量和单细胞 RNA 测序以及 CRC 的临床数据。HRGs 和 LMRGs 来自分子特征数据库。使用 R 软件包 DESeq2 进行差异表达分析。使用无监督聚类进行分子亚型。使用单变量 Cox 回…

嘉宾云集旌城 只为大赛而来 2024ISGC国际烈酒(中国)大奖赛在德阳落下帷幕

秋高气爽、古蜀之源&#xff0c;迎来第六届国际烈酒&#xff08;中国&#xff09;大奖赛&#xff1b;五谷丰登、重装之都&#xff0c;齐聚百名国际烈酒大奖赛评委。 9月18日&#xff0c;由德阳市人民政府、国家葡萄酒及白酒露酒产品质量检验检测中心、上海合作组织多功能经贸平…

图片压缩怎么弄?教你5种图片压缩小技巧

现如今&#xff0c;图片已成为我们日常生活和工作不可或缺的一部分。然而&#xff0c;高清图片往往伴随着庞大的文件体积&#xff0c;给存储和传输带来诸多不便。这时候我们就需要对图片进行适当的压缩处理&#xff0c;那么该怎么做呢&#xff1f;下面教大家5种图片压缩小技巧&…

GBase 8s 安装手册

没有失败&#xff0c;只有暂时停止成功&#xff01; 一&#xff1a;简介 GBase 8s 产品支持多种处理器平台&#xff0c;除国际主流的 x86_64 处理器&#xff08;包括 Intel 和 AMD&#xff09; 外&#xff0c;全面支持飞腾、鲲鹏、龙芯、兆芯、海光、申威等国产处理器。 GBas…

2025秋招内推|招联金融

【投递方式】 直接扫下方二维码&#xff0c;使用内推码: igcefb 【招聘岗位】 深圳&#xff0c;武汉&#xff1a; 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策划 产品运营 客户体验管理 风险管理 资产管理 【校招流程】 简历投递&#xff1a;9月…

kafka 消费者线程安全问题详细探讨

内容概要 主要内容 常见错误案例 下面这段代码大概逻辑 初始化时 实例化KafkaConsumer, 开启线程拉取消息并且处理 资源释放回调 停止线程、调用kafkaConsumer.close进行资源释放 表面上没有问题&#xff0c;但实际上可能出现线程安全问题&#xff0c;因为poll 和 close 两…

Jetpack Compose 核心组件(Text, Images, Buttons)(6)

导读大纲 1.1 基本组件介绍1.2 Text1.2.1 基本用法1.2.2 设计文字风格 1.3 Image组件1.3.1 从各种来源加载图片1.3.2 关键属性1.3.3 如何加载和显示不同类型的图像1.3.4 内容描述和无障碍访问: 1.4 Button组件1.4.1 基本用法1.4.2 装饰和自定义1.4.3 处理按钮点击1.4.4 重要考虑…

基于python深度学习遥感影像地物分类与目标识别、分割实践技术

我国高分辨率对地观测系统重大专项已全面启动&#xff0c;高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成&#xff0c;将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB&#xff0c;遥感大数据时…

JS惰性函数两种实现方式

惰性函数的本质就是函数重写&#xff0c;所谓惰性载入&#xff0c;指函数执行的分支只会发生一次。那什么时函数重写呢&#xff1f;由于一个函数可以返回另一个函数&#xff0c;因此可以用新的函数在覆盖旧的函数。 惰性函数有两种实现方式&#xff1a; 1、在函数被调用时&am…

案例研究丨国控星鲨利用DataEase释放数据潜能,重塑业务视野

国药控股星鲨制药&#xff08;厦门&#xff09;有限公司&#xff08;以下简称为国控星鲨&#xff09;始创于1952年&#xff0c;前身为厦门鱼肝油厂&#xff0c;距今已经有70余年历史&#xff0c;是国家商务部认定的“中华老字号”企业。2011年&#xff0c;国药控股与厦门轻工集…

2024年国庆小长假即将来临,陪猫咪的同时应该如何清浮毛

在父母眼中我们是不是永远都长不大&#xff1f;每次和他们讨论一点事情就开始吵起来。这不&#xff0c;前两天想着和好久不见的朋友去见面&#xff0c;出门前还要被逼问一番。 去到朋友家&#xff0c;发现朋友养了两只可爱的小猫&#xff0c;一时心动上头&#xff0c;我也转身…

通信工程学习:什么是MANO管理编排

MANO&#xff1a;管理编排 MANO&#xff1a;Management and Network Orchestration&#xff08;管理和网络编排&#xff09;在网络功能虚拟化&#xff08;NFV&#xff09;架构中扮演着至关重要的角色。MANO是一个由多个功能实体组合而成的层次&#xff0c;这些功能实体负责管理…

地图定位流程

用户端在小程序认证通过后会自动进行定位&#xff0c;也可以在首页手动定位&#xff0c;定位成功后用户在查询家政服务项目时会根据定位的城市查询该城市有哪些服务项目。 高德地图配置 小程序端的定位是通过手机的定位模块进行定位&#xff0c;定位成功获取经纬度坐标&#x…

吸烟行为检测、重点区域吸烟检测、吸烟检测算法样本标注

吸烟检测算法主要用于公共场所、工作场所和家庭环境中的吸烟行为监控&#xff0c;通过图像识别技术来检测和识别吸烟行为&#xff0c;以确保环境卫生和公共安全。这种技术可以帮助管理者实时监控吸烟行为&#xff0c;及时采取措施&#xff0c;减少二手烟的危害。 一、技术实现…

55 循环神经网络RNN的实现_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录循环神经网络的从零开始实现[**独热编码**]初始化模型参数循环神经网络模型预测[**梯度裁剪**]训练小结练习 循环神经网络的从零开始实现 import math import torch from torch import nn from torch.nn import functional as F from d2l i…

大数据系统调优:从DAG到单机

目标&#xff1a;优化T10的时效性全局DAG调度层优化&#xff1a;提前任务开始时间&#xff1a; 1. 优化慢结点&#xff1a;T10依赖了T4,T7,T8, 其中T8为瓶颈&#xff0c;如果T8能提前点完成&#xff0c;T10可以早点开始&#xff0c;就能早点完成 2. 快结点做更多预计算…

WEB领域是不是黄了还是没黄

进入2024年后&#xff0c;WEB领域大批老表失业&#xff0c;一片哀嚎&#xff0c;个个饿的鬼叫狼嚎&#xff0c;为啥呢&#xff0c;下面是我个人的见解和看法。 中国程序员在应用层的集中 市场需求&#xff1a;中国的互联网行业在过去几年中经历了爆炸性增长&#xff0c;尤其是…

python和pyqt-tools安装位置

一.python的安装位置 1.查询安装的python的位置 先查询python&#xff0c;然后输入import sys和sys.path 二.python-tools的安装位置 找到python的文件后按下图路径即可查到tools的文件