【问题标题】:.NET SIMD adding byte and ushort array.NET SIMD 添加字节和 ushort 数组
【发布时间】:2016-10-31 12:13:02
【问题描述】:
有一个长字节数组需要添加到短类型的目标数组中。可以在这里找到解决方案:
SEE byte + short.
我正在尝试使用managed SIMD 来做到这一点
它缺乏对“解包”指令的支持(需要将单个 16 元素字节数组解包为两个 8 元素短数组以进行添加)。
以下是托管 SIMD 支持的操作:
有谁知道如何使用上面简化的 SIMD 指令集(避免标量加法)实现两个数组的相加(short[] = byte[] + short[])?
【问题讨论】:
标签:
.net
vectorization
sse
simd
managed
【解决方案1】:
下面的API proposal 会添加收窄和加宽操作。提议的 API 遵循与底层 SSE2 指令类似的设计;为了加宽,输入向量的下半部分和上半部分将被写入两个输出向量。为了缩小范围,来自两个输入向量的元素被转换(有符号或无符号饱和度),然后打包成一个输出向量。
作为 API 提案,实际发布可能需要很长时间,也可能需要很长时间。
除非最终升级 JIT 以生成内在函数,否则这些方法是无用的(在性能方面)。恐怕这意味着您应该简单地假设该功能尚不存在。如果您当前使用本机代码方法(通过 C++/CLI 或 P/Invoke),则应继续使用当前方法,因为尚不存在替代方法。
了解 JIT 端实现的状态:Add JIT intrinsics support for vector conversion on AMD64 and x86 #10662
根据 cmets,它不会出现在 .NET Standard 2.0 中,但很可能是 .NET Standard 2.1 的一部分。