【问题标题】:System.Numerics.Vector.GreaterThan and bool resultsSystem.Numerics.Vector.GreaterThan 和 bool 结果
【发布时间】:2017-08-11 15:48:37
【问题描述】:

我正在尝试转换一些可以使用 SIMD 指令优化的现有代码。有一个掩码生成代码,我正在测试转换它后我可以从 SIMD 中获得多少性能,下面是我用来分析它的一个过于简化的块。

Random r = new Random();
var random1 = new double[65536000*4];
var random2 = new double[random1.Length];
var result = new bool[random1.Length];
for (i = 0; i < random1.Length; i++)
{
    random1[i] = r.Next();
    random2[i] = r.Next();
}

var longRes = new long[random1.Length];
for (int i = 0; i < result.Length; i += Vector<double>.Count)
{
    Vector<double> v1 = new Vector<double>(random1, i);
    Vector<double> v2 = new Vector<double>(random2, i);
    Vector<long> res = System.Numerics.Vector.GreaterThan(v1, v2);
    res.CopyTo(longRes, i);
}

有没有一种技术可以有效地将结果res 放入result 数组中?

本来我以为我可以和Vector&lt;long&gt;一起住,把口罩留在long[],但我意识到这可能不可行。

【问题讨论】:

    标签: c# simd


    【解决方案1】:

    正如对原始问题的评论,我意识到System.Numberics.Vector.GreaterThan 和其他类似方法(如LesserThan 等)专为与ConditionalSelect() 一起使用而设计。

    在我的例子中,我试图生成一个 bool 数组,该数组表示稍后在整个 API 中使用的图像掩码,并且将 long 转换为 bool 是不可行的。

    换句话说,这些比较方法并不适合一般用途。

    【讨论】:

    • IDK 如果 C# 阻止您使用硬件可以执行的操作,但 x86 SIMD 可以通过一条指令将向量比较结果转换为标量整数位掩码。 C++ 内在函数是int _mm_movemask_pd(__m128d)。 (也是_ps_epi8 版本。)使用位移/相加将4 个位图与每个2 个有效位组合成一个字节到一个字节,其中8 个double 比较结果可以存储到位图中。
    • 或者将 4 个 4 字节比较结果的向量压缩为 8 位整数并使用 2x packssdw 存储一个 bool 数组是完全可行的 => packsswb 以获取字节元素.你可以AND他们用0x1的向量将0/-1向量转换为0/1。
    • C# 可能无法将所有这些作为内置提供,因为 ARM NEON / AArch64 AdvSIMD 没有 x86 的 _mm_movemask_pd/ps/epi8 等效项。但是您仍然可以在 ARM 中轻松地洗牌/打包成字节元素。如果 C# 不允许您以某种方式执行此操作,请为您的 SIMD 循环使用更好的语言。
    • 我必须稍微消化一下您的 cmets 才能理解您的提议。可能您不同意我的回答并否决了它,所以我会尝试以某种方式改进它。
    • 我可能不应该投反对票,但您声称它们并非旨在用于一般用途。如果 C# 不这样做,我会感到惊讶和失望让你以某种方式为所欲为,因为正如我所说,硬件没有问题。在 asm 中,cmppd 为您提供两个 0/-1 整数元素的向量,其宽度与两个输入 double 操作数相同。如果long 是 4 个字节,则有 shuffle 指令可以将其打包或截断为 4 字节整数。 (我不知道 C#)。有可能 C# SIMD 很糟糕并且让这变得困难。
    猜你喜欢
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 2013-07-03
    相关资源
    最近更新 更多