当前位置: 首页 > news >正文

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


http://www.mrgr.cn/news/2265.html

相关文章:

  • 只用一个 HTML 元素可以写出多少形状?——伪元素篇(上)
  • 微服务架构
  • 网易云音乐崩了!冲上热搜第一
  • Swin-Transformer论文阅读
  • DDoS攻击导致服务器宕机的技术解析
  • 8.19 day pre-bug
  • Python,Nuitka,打包Paddle和Paddleocr,test.dist\\paddle\\fluid\\..\\libs‘;
  • github开源PDF管理工具Stirling-pdf
  • Leetcode 219. 存在重复元素 II
  • 01、Redis入门:数据类型、基本操作、SpringDataRedis
  • el-select 回显操作
  • C语言-部分字符串函数详解 1-4
  • SQL - 数据库管理
  • 【运维项目经历|041】上云项目-物理机迁移到阿里云
  • Nginx反向代理功能
  • 拟合与插值|线性最小二乘拟合|非线性最小二乘拟合|一维插值|二维插值
  • 使用Element UI组件时,icon图标不显示
  • 等保测评的关键指标与评分标准:构建信息安全的量化评价体系
  • 巡检机器人的使用方法和维护保养
  • Keepalived实验