C# simd指令之MaskMove

**MaskMove指令说明:**该方法将掩码向量中的每个非零元素对应的源向量中的元素移动到内存地址指定的位置。如果掩码中的元素为零,则对应的内存位置不会被修改。

MaskMove指令接受三个参数(source、mask、address):

**源向量(source):**包含要移动的数据的 128 位向量。

**掩码向量(mask):**也是一个 128 位向量,用于控制哪些元素将被移动到内存地址。掩码中的每个元素(sbyte)将决定相应位置的元素是否被写入内存。如果掩码中的元素为非零值,则对应的元素将被写入;如果为零,则不写入。

**内存地址(address):**指向目标内存位置的指针,将从这里开始写入数据。

示例

将source向量中的元素全部移到tmpData数组中,这样我们将向量拷贝到数组中的时候就可以用到了

cs 复制代码
Random random = new Random();
int size= Vector128<byte>.Count;
byte[] data = new byte[size << 1];
random.NextBytes(data);
byte[] tmpData = new byte[size];
fixed (byte* dataPtr = data, tmpPtr = tmpData)
{
    Vector128<byte> source = *(Vector128<byte>*)dataPtr;
    Vector128<byte> mask = Vector128.Create((byte)255);
    Sse2.MaskMove(source, mask, tmpPtr);
}

如果需要source指定位置的元素不移动,只需要在mask 指定位置的元素设置为0

cs 复制代码
 // 设置mask第一个元素为0 
mask = mask.WithElement(0, (byte)0);
// source的第一个元素将不在移动到tmpData
Sse2.MaskMove(source, mask, tmpPtr);

也可以把向量复制移动到另外的向量,我们就可以实现向量深拷贝

cs 复制代码
Vector128<byte> newVector;
Sse2.MaskMove(source, mask, (byte*)&newVector);
相关推荐
倒头就睡的小比特2 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼2 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光2 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark2 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her12 天前
并查集-听课笔记
笔记·算法·并查集
码流子2 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven2 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark2 天前
从算法设计模式看编程思维的抽象能力4
算法
2601_962218612 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法