【发布时间】:2020-11-22 03:41:52
【问题描述】:
我想知道如何替换 Vector128<byte> 中的字节值
我认为可以假设下面的代码中我们有一个resultvector
这些价值观:
在这里我想创建一个新向量,其中所有“0”都将替换为“2” 并且所有“1”都将被替换为“0”,如下所示:
我不确定这是否有内在函数或如何实现?
谢谢!
//Create array
byte[] array = new byte[16];
for (int i = 0; i < 4; i++) { array[i] = 0; }
for (int i = 4; i < 8; i++) { array[i] = 1; }
for (int i = 8; i < 16; i++) { array[i] = 0; }
fixed (byte* ptr = array)
{
byte* pointarray = &*((byte*)(ptr + 0));
System.Runtime.Intrinsics.Vector128<byte> resultvector = System.Runtime.Intrinsics.X86.Avx.LoadVector128(&pointarray[0]);
//<0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0>
//resultvector
}
【问题讨论】:
-
也许像
2-(resultvector<<1)之类的东西(如果无法转换,只需添加到自身)。但是您实际上是如何计算resultvector的? (如果您能够修改该计算,可能会有更有效的方法)。 -
我编辑了我的帖子。我认为这个例子等于真实的例子是我留下这个
resultvector的地方。我不确定这意味着什么:2-(resultvector<<1)?我使用 C#。 -
<<是移位运算符。我对 C# 不是很熟悉,所以我不知道它是否允许 SIMD 类型(或者 C# 是否为 SIMD 类型重载运算符......)。本质上,您需要为每个元素计算2-(a[i]+a[i])(必须有一种方法,只需两条 SIMD 指令)。 -
你可能不明白我所说的“你如何实际计算
resultvector”是什么意思。如果您的代码是您实际计算它的方式,只需将array[i]=0;替换为array[i]=2;并将array[i]=1;替换为array[i]=0(我确定这不是您需要的......)。 -
是的,我不确定
<<是否可以使用。我从未见过在 C# 中使用的那个。我认为这是不可能的。我相信 C# 中一定有某种 SIMD 指令可以以某种方式使用,我希望。
标签: c# simd intrinsics