筛子排序(SieveSort) - 2

前一篇给出的代码有错,正在修正中。

这里先给出循环版本

 __m512i sieve_sort32x16_loop(__m512i a, uint32_t* result = nullptr) {uint32_t buffer[16] = { 0 };if (result == nullptr) _mm512_store_epi32(result = buffer, a);__mmask16 mask = 0xffff;uint32_t _min = 0, _max = 0;__mmask16 _min_mask = 0, _max_mask = 0;int i = 0, j = 15;while (sieve_get_min_max(mask, a, _min, _max, _min_mask, _max_mask)) {int c_min = __popcnt16(_min_mask);int c_max = __popcnt16(_max_mask);for (int t = 0; t < c_min; t++) {result[i++] = _min;}for (int t = 0; t < c_max; t++) {result[j--] = _max;}mask &= ~(_min_mask | _max_mask);}return _mm512_loadu_epi32(result);
}

目标显然是,追求性能的极致。而这个版本里面有循环,性能恐怕有损失,但是容易阅读和理解。

同样是每次都获取最大值和最小值,然后分别从两头往中间填充结果。这里__popcnt16函数起到了求参数中1的个数的作用,而这些1就对应了里面的最大值和最小值的位置。所以有几个1,这一次就找到了几个最大值或者最小值。最后用

mask &= ~(_min_mask | _max_mask);

把这些找到的最大值和最小值都屏蔽掉,下次就不考虑它们了。基本的布尔运算就不细说了,你懂的。

需要说明的是,函数sieve_get_min_max查找最大最小值的时候,有可能重复,所以它必须改成最大和最小值相关联的形式,

bool sieve_get_min_max(__mmask16 mask, __m512i a, uint32_t& _min, uint32_t& _max, __mmask16& _mask_min, __mmask16& _mask_max) {if (mask != 0) {_mask_max = _mm512_mask_cmpeq_epi32_mask(mask, a, _mm512_set1_epi32(_max = _mm512_mask_reduce_max_epu32(mask, a)));_mask_min = _mm512_mask_cmpeq_epi32_mask(mask & (~_mask_max), a, _mm512_set1_epi32(_min = _mm512_mask_reduce_min_epu32(mask & (~_mask_max), a)));return true;}return false;
}

也就是说最大值的查找会影响最小值的查找结果。查找最小值的时候必须排除排除最大值,不然可能出现重复计算。上一章给出的代码出错,就是重复计算造成的。

改动在这里:

_mask_min = _mm512_mask_cmpeq_epi32_mask(mask & (~_mask_max), a, _mm512_set1_epi32(_min = _mm512_mask_reduce_min_epu32(mask & (~_mask_max), a)));

为了尽可能快,就要尽量去除循环,所以进一步简化可以得出如下版本,

__m512i sieve_sort32x16_loop(__m512i a, uint32_t* result = nullptr) {__m512i target = zero;__mmask16 mask = 0xffff;__mmask16 _min_mask = 0, _max_mask = 0;uint32_t _min = 0, _max = 0;int i = 0, j = 16;while (sieve_get_min_max(mask, a, _min, _max, _min_mask, _max_mask)) {int c_min = __popcnt16(_min_mask);int c_max = __popcnt16(_max_mask);target = _mm512_mask_blend_epi32((-(!!c_min)) & ((~((~0U) << c_min)) << i),target, _mm512_set1_epi32(_min));target = _mm512_mask_blend_epi32((-(!!c_max)) & ((~((~0U) << c_max)) << (j - c_max)),target, _mm512_set1_epi32(_max));i += c_min;j -= c_max;mask &= ~(_min_mask | _max_mask);}if (result != nullptr) {_mm512_storeu_epi32(result, target);}return target;
}

用位运算代替判断:"(-(!!c_min))&"这保证了若c_min为0,则整个mask都为0;用移位设置mask,比如(~0U)=0b1111111111111111,对其左移就可以获得0b111...1000...然后再翻转就可以获得需要的个数的1的序列,然后再把它放在正确的位置上。最后用混合操作,将最小值或者最大值混入结果。

这就消去了循环的影响。

毕竟循环最终也只是为了实现最小值或者最大值多次出现在不同的位置。显然用组合逻辑电路的思路来编程,就可以最大化的实现并行性。

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

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

相关文章

中国土地利用覆盖和变化数据集(1980-2021)

该数据集通过融合森林资源清查数据和20种遥感土地利用产品&#xff0c;重建生成了1980-2015年中国森林覆盖数据集&#xff0c;空间分辨率为11公里。并且在此基础上进一步获得高精度森林覆被信息和土地利用覆盖数据集相融合&#xff0c;生成了中国1980-2021年土地利用覆盖和变化…

Vue3 + Vite Web项目 Electron 打包桌面应用程序

在根目录下创建 electron 文件夹 创建 electron/main.js 文件&#xff1a; // 导入模块 const { app, BrowserWindow ,Menu } require(electron) const path require(path)// 创建主窗口 const createWindow () > {const mainWindow new BrowserWindow({width: 1440…

RHEL7(RedHat红帽)软件安装教程

目录 1、下载RHEL7镜像 2、安装RedHat7 注&#xff1a;如果以下教程不想看&#xff0c;可以远程控制安装V:OYH-Cx330 【风险告知】 本人及本篇博文不为任何人及任何行为的任何风险承担责任&#xff0c;图解仅供参考&#xff0c;请悉知&#xff01;本次安装图解是在一个全新的演…

【网络安全】TCP和UDP

一、TCP/UDP对比 1.共同点&#xff1a; 都是工作在TCP/IP体系结构的传输层的协议 工作主要都是把端口号往原始数据封装 在 TCP 协议中&#xff0c;原始数据指的是应用程序产生的需要通过网络进行传输的数据。这些数据可以是各种类型的信息&#xff0c;例如文本、图像、音频、…

【项目】多设计模式下的同步异步日志系统

文章目录 项目介绍开发环境核心技术日志系统介绍为什么需要日志系统日志系统技术实现同步写日志异步写日志 相关技术知识补充不定参函数不定参宏函数的使用C中不定参函数的使用C中不定参函数的使用 设计模式单例模式工厂模式建造者模式代理模式 日志系统框架设计模块划分日志等…

高校大数据实训管理平台怎么选择?

泰迪智能科技大数据实训管理平台分为多个方向包括&#xff1a;人工智能方向、大数据方向、商务数据分析方向&#xff0c;不同高校可以结合高校情况选择合适自己院校的相关产品平台。 高校实训管理平台是实验室模块的核心母平台&#xff0c;对实验室的所有课程及实训资源进行统…

【Linux】手把手教你制作一个简易shell——(进程创建fork进程替换wait与进程等待exec的应用)(自定义shell程序设计)

前言 大家好吖&#xff0c;欢迎来到 YY 滴Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

HTTP协议:发展、请求响应、状态码 等

文章目录 HTTP发展历程HTTP请求URL和URIHTTP协议版本HTTP请求方法GET 和 POST 区别HTTP状态码HTTP 请求与响应报文HTTP 请求流程 HTTP 超文本传输协议&#xff08;Hypertext Transfer Protocol&#xff0c;HTTP&#xff09;是一个简单的请求-响应协议&#xff0c;它通常运行在…

快速数据检索最佳闪存驱动器恢复下载

当你意识到你的闪存盘丢失了重要文件时&#xff0c;你是否曾有过心脏停跳的时刻&#xff1f;丢失数据可能会毁掉你的一天&#xff0c;并带来很大的压力&#xff0c;无论是重要的工作文件&#xff0c;你喜欢的照片&#xff0c;还是备份你需要保持。好消息是&#xff0c;在闪存驱…

Leetcode 合并区间

我们借助一个辅助链表(元素类型是一维数组)来进行结果统计。 这个算法解决了“合并区间”的问题&#xff0c;具体要求是给定一组区间&#xff08;每个区间有开始和结束位置&#xff09;&#xff0c;如果两个区间有重叠&#xff0c;那么需要将它们合并成一个区间&#xff0c;并…

Cisco Packet Tracer超详细下载安装教程(附中文版插件)

一、安装包下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1RK8iQ9lJG__vBEGCYVYNSA 提取码&#xff1a;1lvb 压缩包解压密码&#xff1a;66668888&#xff0c;不能正常解压的&#xff0c;推荐使用360压缩解压 二、安装教程&#xff1a; 1.双击启动安装包 2.点击N…

使用功率谱密度 (PSD) 表征噪声

传递函数塑造噪声 图 1 显示了假设噪声源的频谱&#xff0c;该噪声源在所有频率下均表现出相同的平均功率&#xff0c;即 &#xff0c;其中 η 是常数。 假设噪声源的频谱。 图 1. 假设噪声源的频谱。 如果我们将此噪声应用于 LTI 系统&#xff0c;系统的传递函数将决定不同…

基于丹摩智算平台-手把手拿下经典目标检测模型 Faster-Rcnn

文章目录 1. 前言1. 1 丹摩智算平台1.2 经典目标检测模型 Faster-Rcnn 2. 前置准备2.1 WindTerm&#xff08;远程连接服务器&#xff09;2.2 项目源码 3. 服务器平台配置3.1 创建实例3.2 远程链接 4. Faster-rcnn 的环境配置4.1 上传文件&#xff0c;解压4.2 安装所需环境 5. 数…

springboot框架VUE3学院网站系统开发mysql数据库设计java编程计算机网页源码maven项目

博主介绍&#xff1a;专注于Java vue .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的…

专业软件测试服务机构介绍:软件确认测试的类型和方法

随着现代科技的迅猛发展&#xff0c;软件开发逐渐成为各类企业发展的核心。然而&#xff0c;软件的质量直接关系到企业的运营效率和用户体验。因此&#xff0c;软件确认测试作为确保软件质量的重要环节&#xff0c;正受到越来越多的关注。 软件确认测试是指在软件开发周期的最…

tensorboard展示不同运行的曲线结果

运行tensorboard曲线如下&#xff1a; tensorboard --logdir .有时候&#xff0c;曲线图会展示多条曲线&#xff0c;以至于我们想分辨哪条线来自哪次训练都做不到了。如下图是设置smoothing-0.6的结果&#xff1a; smoothing可以在页面找到设置按钮&#xff0c;呼出设置侧边…

Llama 3.1 技术研究报告-2

3.3 基础设施、扩展性和效率 我们描述了⽀持Llama 3 405B⼤规模预训练的硬件和基础设施&#xff0c;并讨论了⼏项优化措施&#xff0c;这些措施提⾼了训练效率。 3.3.1 训练基础设施 Llama 1和2模型在Meta的AI研究超级集群&#xff08;Lee和Sengupta&#xff0c;2022&#x…

直播美颜工具的开发详解:基于视频美颜SDK的解决方案

视频美颜SDK的出现&#xff0c;为开发直播美颜工具提供了一种高效的解决方案。本文将详细解析如何基于视频美颜SDK&#xff0c;开发一款性能优越、功能齐全的直播美颜工具。 1.视频美颜SDK的核心功能 视频美颜SDK是实现实时美颜的关键技术&#xff0c;其核心功能包括人脸检测、…

mysql逗号分隔的一行数据转为多行数据

原表&#xff1a; 结果&#xff1a; 方法一&#xff1a;如果每条数据的被逗号分隔的数量在637条以内&#xff0c;使用 mysql.help_topic&#xff08;mysql自带的表&#xff0c;只有637个序号&#xff09;。 select a.id,a.enclosure_ids,SUBSTRING_INDEX(SUBSTRING_INDEX(a.en…

harmonyOS 原来构建还有这么多弯弯绕绕

随着用户需求的不断增长&#xff0c;我们的 APP 已发展成功能丰富的超级APP&#xff0c;这也导致打包构建变得非常耗时&#xff0c;可能需要数小时&#xff0c;严重影响开发效率和产品迭代。通过采用模块化设计、增量构建、并行处理、缓存机制、优化依赖管理&#xff0c;以及云…