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

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

测试数据创建

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;
                    }
                }
            }
        }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 索引合并优化实践

在生产环境的数据库中&#xff0c;经常会看到有些 SQL 的 where 条件包含&#xff1a;普通索引等值 主键范围查询 order by limit。明明走普通索引效率更高&#xff0c;但是选择走了索引合并&#xff0c;本文就对这种索引合并的情况研究一下。 作者&#xff1a;张洛丹&#x…

【Linux】Linux环境基础开发工具使用之Linux调试器-gdb使用

目录 一、程序发布模式1.1 debug模式1.2 release模式 二、默认发布模式三、gdb的使用结尾 一、程序发布模式 程序的发布方式有两种&#xff0c;debug模式和release模式 1.1 debug模式 目的&#xff1a;主要用于开发和测试阶段&#xff0c;目的是让开发者能够更容易地调试和跟…

JSON Web Token (JWT): 理解与应用

JWT&#xff08;JSON Web Token&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;它定义了一种紧凑且自包含的方式&#xff0c;用于在各方之间以JSON对象的形式安全地传输信息。JWT通常用于身份验证和授权目的&#xff0c;因为它可以使用JSON对象在各方…

【Python】函数进阶(中)

2、函数和函数名 函数名其实就是一个变量&#xff0c;这个变量只不过代指的是函数而已。 例如&#xff1a; 注意&#xff1a;函数必须先定义才能被调用执行&#xff08;Python是解释型语言&#xff0c;代码从上到下边解释边执行&#xff09; #正确代码 #错误代码 &#xff0…

20 数据可视化

20 数据可视化 本章概述一. `elasticsearch`实现数据统计1.1 创建用户信息索引1.1.1 控制台创建`aggs_user`索引1.1.2 `aggs_user`索引结构初始化1.1.3 创建`aggs_user`索引的`EO`对象1.1.4 用户类型枚举1.1.5 数据初始化****************************************************…

Redis中缓存穿透、缓存击穿、缓存雪崩的详解

如何理解Redis缓存的穿透、击穿、雪崩问题&#xff1a; 缓存穿透 是指缓存中和数据库中都没有数据&#xff0c;而用户不断访问&#xff0c;导致这个不存在的数据每次请求都要到存储层去查询&#xff0c;这样失去了意义。 缓存穿透的解决方案有哪些? 缓存null值布隆过滤增强…

C++观察者模式Observer

组件协作 –(都是晚绑定的&#xff09; ----观察者模式 为某些对象建立一种通知依赖的关系&#xff0c; 只要这个对象状态发生改变&#xff0c;观察者对象都能得到通知。 但是依赖关系要松耦合&#xff0c;不要太依赖。 eg&#xff1a;做一个文件分割器&#xff0c;需要一个…

基于ESP32的OEE分析开发板上MQTT协议的实现

整理自 《Implementation of MQTT Protocol on ESP32-Based OEE Analysis Development Board》&#xff0c;作者是Amir Akbar Wicaksono, Yuli Kurnia Ningsih, 和 Indra Surjati&#xff0c;发表于《MITOR: Jurnal Teknik Elektro》。论文讨论了在工业4.0背景下&#xff0c;通…

Centos7 message日志因dockerd、kubelet、warpdrive、containerd等应用迅速增长

问题&#xff1a;公司服务器在部署一套业务后&#xff0c;message日志记录大量的dockerd、kubelet、warpdrive、containerd应用日志&#xff0c;每天增加2G大小的日志 解决方案&#xff1a; 前期吐槽下&#xff1a;发现某个帖子&#xff0c;需要会员或者花钱才能看&#xff0c…

企业高性能web服务器知识点合集

文章目录 nginx源码编译安装平滑升级及版本回滚平滑升级版本回滚 服务启动脚本核心配置全局配置参数优化调整root与alias自定义错误日志自定义错误页面检测文件是否存在长链接配置下载服务器的配置 nginx高级配置nginx状态页面压缩功能变量内置变量自定义变量 nginx rewrite指令…

【软件测试面试题】WEB功能测试(持续更新)

Hi&#xff0c;大家好&#xff0c;我是小码哥。最近很多朋友都在说今年的互联网行情不好&#xff0c;面试很难&#xff0c;不知道怎么复习&#xff0c;我最近总结了一份在软件测试面试中比较常见的WEB功能测试面试面试题合集&#xff0c;希望对大家有帮助。 建议点赞收藏再阅读…

腾讯云 AI 代码助手四大基础功能介绍

引言 随着技术的不断进步&#xff0c;软件开发者们面临着日益复杂的编程任务和挑战。他们不仅需要处理大量的代码&#xff0c;还要在保证代码质量的前提下&#xff0c;提高开发效率。在这样的背景下&#xff0c;一款能够辅助开发者进行高效编码的工具显得尤为重要。 腾讯云AI…

sentinel 02 核心类

01 02. 03. 04. 05. 4.1 4.2 4.3 4.4 5调用链

从0到1:AI与低代码如何推动企业创新

引言 在当今瞬息万变的商业环境中&#xff0c;创新已成为企业在激烈市场竞争中立于不败之地的关键驱动力。面对快速变化的市场需求、技术进步和全球化竞争&#xff0c;企业亟需打破传统的增长模式&#xff0c;从而实现真正意义上的突破性创新。“从0到1”这一理念&#xff0c;源…

C++入门:C语言到C++的过渡

目录 前言&#xff1a;C——为弥补C缺陷而生的语言 C的输入与输出 1.引子&#xff1a;C的第一个程序 2.C的输入与输出 3.命名空间 疑难解答 1.对输入输出流的一个基本概念 2.从流当中存入及提取数据 前言&#xff1a;C——为弥补C缺陷而生的语言 C起源于 1979 年&…

微信小程序--24(列表渲染)

一、wx&#xff1a;for 1.作用 根据指定数组&#xff0c;循环渲染重复的组件结构 2.语法 <view wx:for"{{data中的数据}}"> 索引是&#xff1a;{{index}}, item项是&#xff1a;{{item}}</view> index:表索引item&#xff1a;表当前循环项 …

全国产化服务器:飞腾FT2000+/64核密集计算、显控及存储一体式加固服务器

飞腾FT2000/64核的加固服务器是一款专为高安全性、高可靠性及能在严苛环境下稳定运行而设计的服务器产品。以下是对该服务器的详细介绍&#xff1a; 一、处理器与核心组件 处理器&#xff1a;搭载飞腾FT2000/64核处理器&#xff0c;该处理器基于ARM架构&#xff0c;集成了64个…

KubeSphere核心实战_kubesphere部署redis01_为redis指定配置文件_指定存储卷_配置服务---分布式云原生部署架构搭建047

然后我们再来,部署一下redis,可以看到,首先去容器官网去找到对应的redis的镜像然后 可以看到镜像中都有说的,如何启动,以及 --appendonly yes 是指定持久化.然后 /data表示数据存储的位置. 可以看到数据存储位置 然后还有配置文件的位置. 可以看到,我们首先去创建配置文件,然后…

SQL进阶技巧:多维分析之如何还原任意维度组合下的维度列簇名称?【利用grouping_id逆向分析】

目 录 0 需求描述 1 数据准备 2 问题分析 3 小结 0 需求描述 现有用户访问日志表 visit_log ,每一行数据表示一条用户访问日志。 需求: (1)按照如下维度组合 (province), (province, city), (province, city, device_type) 计算用户访问量,要求一条SQL语句统计所所…

【Spring Boot】全局异常处理

目录 背景 前言 设计步骤 1.定义异常信息类&#xff1a; 2.自定义异常&#xff1a; 3.创建全局异常处理类 4.在控制器中抛出异常 5.输出 捕获 Valid 校验异常 背景 去面试的时候被问到SpringBoot项目中&#xff0c;如何处理全局异常的&#xff0c;也就是如何捕获全局异…