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语言预处理详解:编译器真正动手之前的那些事
c语言·开发语言·算法·面试·bug
毕竟是shy哥5 小时前
计算YOLO数据集中每个类的目标数
算法·yolo·机器学习
M78佐菲5 小时前
Linux学习笔记:TCP协议
linux·笔记·学习·tcp/ip·算法
晊晌_h6 小时前
嵌入式从0到精通——数据结构总结[特殊字符]
数据结构·算法·排序算法
我找到地球的支点啦7 小时前
Matlab系列(009) 一CRC循环冗余校验详解
开发语言·数据结构·算法·matlab·信息与通信
罗西的思考7 小时前
【OpenClaw具身硬件】ZeroClaw 源码阅读笔记(3)--- RAG
人工智能·算法·机器学习
浪里镖客8 小时前
位姿转换矩阵写法-个人习惯(计算机理解其实是相反的)
线性代数·算法·矩阵
小白羊丨11 小时前
如何诊断 Prompt 模板导致的效果下降?
人工智能·算法·prompt
OPEN-F12 小时前
C++11/14新特性精讲:移动语义与智能指针实战
开发语言·c++·算法
lisin-lee-cooper12 小时前
【leetcode658】有序数组找出k个最接近x的数
java·数据结构·算法