gpt4 book ai didi

C# SIMD 使用 System.Numerics.Vector 排序/中值

转载 作者:行者123 更新时间:2023-11-30 21:46:44 29 4
gpt4 key购买 nike

我有一个视频处理代码,需要使用其 4 个相邻像素的中值来确定每个像素的值。所以,我有一个 4 字节的数组,必须以一种高效的方式找到它的中位数。首先,我必须对数组进行排序,然后对 2 个中间值进行平均。我必须对图像的一半像素执行此操作,以便可以并行完成。

这可以使用 System.Numerics.Vector 完成吗?

文档中也不清楚:System.Numerics.Vector 是为 x86 代码还是仅为 x64 创建 SIMD?

最佳答案

在这个回答中,我不会费心在正确的地方获取数据,只是中等业务。

我假设您有单独的左/上/右/下向量。将它们打包在一个向量中会非常烦人,而且实际上也更难设置,因为这不能通过简单的加载来完成。

您不必排序(这需要大量的比较和 ConditionalSelects)来找到 4 的中位数。找到最小值和最大值并删除它们就足够了(当然每个一次)。查找最小值和最大值很容易,只需应用 Vector.MinVector.Max 几次。 “除”就是从4个东西的和中减去它们。当然,由于它的结果表示两个字节的总和,它本身不能放在一个字节中[注 1],因此不幸的是,大部分计算都是在 16 位中完成的,吞吐量减半。最后,只需将中间两个值的和右移 1 即可得到它们的平均值,您可以将其转换回 8bit。

或者简而言之,没有排序的 4 的中位数是:

median = (a + b + c + d - min(a, b, c, d) - max(a, b, c, d)) >> 1;

您可以选择在类次前加 1 以获得四舍五入的平均值。

1:如果不是那样,让计算回绕就可以解决所有问题。如果它是 3 的中位数,结果适合 8 位,因此它可以在不加宽的情况下完成(即使总和可能会换行,减法也会将它“展开”相同的数量).当然也可以用XOR来做,效果更明显。

关于C# SIMD 使用 System.Numerics.Vector 排序/中值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39050526/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com