C# 不一样的洗牌算法---Simd指令

news2024/11/26 10:24:14

洗牌算法,以随机打乱数组中元素的位置

测试数据创建

int[] _data;
Random rng = new Random();
protected override void CreateData()
{
    _data = new int[_size];
    for (int i = 0; i < _data.Length; i++)
    {
        _data[i] = i;
    }
}

普通打乱数组元素位置

protected override void OrdinaryMethod()
  {
      int n = (int)_size;
      while (n-- > 1)
      {
          int k = rng.Next(n + 1);
          int value = _data[k];
          _data[k] = _data[n];
          _data[n] = value;
      }
  }

simd打乱

readonly int[] mask = { 30, 39, 45, 54, 57, 75, 78, 99, 108, 114, 120, 135, 141, 147, 156, 177, 180, 198, 201, 210, 216, 225, 228 };
protected override void SimdMethod()
{
    int n = (int)_size;
    int vsize = Vector128<int>.Count;
    int m = n - (n & (vsize - 1));
    fixed (int* ptr = _data, maskPtr = mask)
    {
        int j = 0;
        int i = 0;
        for (j = 0; j < m; j += vsize)
        {
            Vector128<int> v = *(Vector128<int>*)(ptr + j);
            // 打乱
            var t = Sse2.Shuffle(v, (byte)*(maskPtr + rng.Next(mask.Length)));
            // 拷贝
            Sse2.Store(ptr + j, t);
            j += vsize;
        }
        for (; j < n; j++)
        {
            int* t = ptr + rng.Next(n);
            int* val = ptr + j;
            *val = (*t ^= *val ^= *t) ^ *val;
        }
    }
}

指令说明

Shuffle指令:用于根据提供的控制值(control)重新排列 Vector128<int> 类型向量中的元素。(比如洗牌算法打乱数组中元素的位置)。

Store指令:将向量的数据存储到内存地址。

补充,上面Simd打乱数组位置为局部打乱,下面是全局打乱

protected void SimdMethod2()
            {
            int n = (int)_size;
            int vsize = Vector128<int>.Count;
            int m = n - (n & (vsize - 1));
            Vector128<int>[] vectors = new Vector128<int>[m / vsize];
            fixed (int* ptr = _data, maskPtr = mask)
            {
                fixed (Vector128<int>* vptr = vectors)
                {
                    int j = 0;
                    int i = 0;
                    for (j = 0; j < m; j += vsize)
                    {
                        *(vptr + i++) = *(Vector128<int>*)(ptr + j);
                    }
                    j = 0;
                    for (i = 0; i < vectors.Length; i++)
                    {
                        Sse2.Store(ptr + j, Sse2.Shuffle(*(vptr + i), (byte)*(maskPtr + rng.Next(mask.Length))));
                        j += vsize;
                    }
                    for (; j < n; j++)
                    {
                        int* t = ptr + rng.Next(n);
                        int* val = ptr + j;
                        int temp = *t;
                        *t = *val;
                        *val = temp;
                    }
                }
            }
        }

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

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

相关文章

VBA学习(27):在筛选数据中复制可见单元格

在筛选数据中复制数据时&#xff0c;可以按原结构粘贴所复制的数据。具体如下文&#xff1a; 下图所示为示例数据。 我们对列C进行筛选&#xff0c;如下图所示 复制单元格区域B2:B10&#xff0c;然后粘贴到以单元格E2开始的区域&#xff0c;结果如下图所示。正如所见&#xff…

LLM之RLHF:Karpathy视角来对比RLHF技术和RL技术—RLHF is just barely RL(RLHF只是勉强算作强化学习)

LLM之RLHF&#xff1a;Karpathy视角来对比RLHF技术和RL技术—RLHF is just barely RL(RLHF只是勉强算作强化学习) 导读&#xff1a;2024年8月8日&#xff0c;Karpathy发表了一个有意思的观点&#xff0c;RLHF is just barely RL. 强化学习从人类反馈(RLHF)训练方法只是勉强属于…

怎么将音乐转为mp3格式?7种简单的手机音频转换方法!

怎么将音乐转为mp3格式&#xff1f; mp3是一种运用比较广泛的格式&#xff0c;几乎所有的音频设备、播放器和操作系统都可以播放MP3音乐。如果你的音频文件不是mp3格式&#xff0c;那么可以通过专业的mp3格式转换器进行转换。这样就不会出现格式不兼容&#xff0c;无法正常使用…

第四范式发布AI+5G视频营销产品 助力精准获客与高效转化

产品上新 Product Release 今天&#xff0c;第四范式AI5G视频电话互动营销产品全新发布。 相较于以往销效率低、互动差、转化差的传统电话外呼和短信营销方式&#xff0c;视频电话互动营销基于AI、5G等技术&#xff0c;可让用户接听电话时观看个性化视频广告并实时互动&#xf…

Fortify三种扫描模式有什么区别?分别怎么用?

一、通过“Audit Workbench”进行测试 “Audit Workbench”支持Java语言源代码的测试。 二、通过“Scan Wizard”进行测试 “Scan Wizard”支持Java、Python、C/C、.Net、Go、PHP、Flex、Action Script、HTML、XML、JavaScript、TypeScript、Kotlin、SQL、ABAP、ColdFusion语言…

基于asp.net的简单的BBS论坛管理系统源码

今天给大家分享一套c#的webform框架的简单的BBS论坛管理系统源码&#xff0c;老规矩&#xff0c;下载链接我放在了最后面了&#xff0c;需要的自行下载&#xff0c;喜欢的小伙伴记得点个赞哦&#xff01; 1.主要功能 这个系统是比较简单的BBS的论坛管理系统源码&#xff0c;包…

C++ //练习 17.2 定义一个tuple,保存一个string、一个vector<string>和一个pair<string, int>。

C Primer&#xff08;第5版&#xff09; 练习 17.2 练习 17.2 定义一个tuple&#xff0c;保存一个string、一个vector和一个pair<string, int>。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /**********************…

GD32 MCU内部温度传感器如何使用,以及适合哪种应用场景?

GD32 MCU全系列产品均内置温度传感器&#xff0c;内部温度传感器可以用于测量器件周围温度及变化&#xff0c;传感器的输出电压连接到ADC的第16通道&#xff0c;可被ADC转换成数字量。 温度传感器输出电压随温度线性变化&#xff0c;由于生产过程中的多样化&#xff0c;温度变…

索引使用规则以及注意失效的场景

目录 一、联合索引遵循最左前缀法则 1.1 执行带着唯一索引和联合索引情况: 1.2 执行不带最左侧字段情况: 1.3 执行跳过中间列情况&#xff1a; 1.4 使用联合索引查找是否跟建立索引的顺序有关&#xff1f; 二、范围查询 三、避免某些操作导致索引失效 3.1 索引列运算 3…

(计算机网络)数据链路层

目录 一.基本概述 二.基本术语 三.基本功能 四.CRC差错检验 五.点对点协议 六.PPP帧格式 七.以太网介绍 一.基本概述 结点&#xff1a;可以相当于一个实体。能够具备接收数据&#xff0c;发送数据的实体 物理层不关心介质问题&#xff0c;发送端和接收端数据不一致&…

docker配置国内镜像加速

docker配置国内镜像加速 由于国内使用docker拉取镜像时&#xff0c;会经常出现连接超时的网络问题&#xff0c;所以配置Docker 加速来使用国内 的镜像加速服务&#xff0c;以提高拉取 Docker 镜像的速度。 1、备份docker配置文件 cp /etc/docker/daemon.json /etc/docker/da…

Datawhale AI 夏令营——从零入门多模态大模型数据合成——Task1学习笔记

天池Better Synth 官方赛事链接&#xff1a;天池Better Synth多模态大模型数据合成挑战赛_算法大赛_天池大赛-阿里云天池的赛制 一、内容提要 天池Better Synth多模态大模型数据合成挑战赛 是 Datawhale 2024 年 AI 夏令营第四期的学习活动—— 适合想 入门并实践 多模态大模型…

java 实现-使用OpenFeign 实现远程调用外部接口(调用swgager)接口

首先根据提供的swagger路径&#xff0c;在网页中查看相关接口方法 打开接口后我们可以看见&#xff0c;接口的路径/online/list 以及可以看见入参和出参 根据所有提供的参考方法和路径&#xff0c;拼接出整体路径URL&#xff08;http://ip:端口/online/list&#xff09; 注意…

一键生成PPT、漫画、长文:橙篇让创意一触即发

​ 橙篇 如何快速高效地创作优质内容&#xff0c;成为了每个创作者都在思考的问题。而今天&#xff0c;我们要介绍的这款神器——橙篇&#xff0c;或许就是解开这个难题的钥匙。它不仅能让你的创意一触即发&#xff0c;更能将你的灵感瞬间化为现实。 橙篇 多样化功能 橙篇不仅仅…

21款奔驰GLS450升级原厂香氛负离子系统,提升车内空气质量

奔驰原厂香氛系统激活原车自带系统&#xff0c;将香气加藏储物盒中&#xff0c;通过系统调节与出风口相结合&#xff0c;再将香味传达至整个车厢&#xff0c;达到净化车厢空气的效果&#xff0c;让整个车厢更加绿色健康&#xff0c;清新淡雅。 产品功能&#xff1a;香氛负离子…

Java JDVC编程

1、Java的数据库编程&#xff1a;JDBC JDBC&#xff08;Java Database Connectivity&#xff09;是Java中用来与数据库进行交互的一种标准API&#xff08;应用程序编程接口&#xff09;。它为开发人员提供了一种统一的方式来访问各种类型的数据库管理系统&#xff08;DBMS&…

火锅店管理系统

TOC springboot260火锅店管理系统 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔记本的广泛运用&am…

(24)(24.3) MSP OSD(二)

文章目录 前言 3 OSD面板项目配置 4 使用SITL测试OSD 5 使用任务规划器配置布局 6 视频 前言 ArduPilot 支持 MSP OSD 协议&#xff0c;该协议允许在 DJI 护目镜上显示飞行数据&#xff0c;就像许多自动驾驶仪中的外部 MAVLink OSD 或内部集成模拟 OSD 一样。如果配置了 …

世界顶级思想家起名大师颜廷利:金融离不开银行,灵魂离不开引航

在《升命学说》一书中,山东济南的杰出人物、被广泛认为是最有影响力的哲学家之一的颜廷利教授,提出了一系列深奥而又实用的生命哲学。这些理念不仅是对传统文化的传承,也是对现代社会的深刻洞察。 世界伟大人民的哲学家思想家教育家,山东籍当代文化名人颜廷利教授提出,生命的本…

winApi与QtApi的共享内存通信

目的 就是A程序是QT的程序用的QT的接口读取共享内存,B程序是WinApi创建的共享内存,两个程序进行共享内存; 其间还有信号量,信号量,统一用的winApi的信号量。 就是下边这种情况: 下边的这个例子,就针对两块重点,进行分析: 1、QT侧的共享内存与win Api的共享内存如何…