我考虑用C#而不是C ++编写视频处理库。 C ++的优点是可以在原始视频帧缓冲区上使用指针。 C#在该缓冲区上有一个可以来回寻找的MemoryStream。
数学公式需要逐个应用于每个像素;如果在C ++中使用程序集优化,则为8乘8或16乘16。
如何在C#中执行此操作与在C ++中执行此操作或使用SSE2程序集进行比较?
C#确实具有可以使用所有CPU特定指令(如AVX和AVX2)的优势,因为它可以即时进行最终编译,以及它的表现如何?
是否有针对此类任务从C#中获得最佳性能的最佳实践?
与指针相比,在MemoryStream中移动光标也会使语法更复杂。有没有办法简化这个?
编辑:基于此处和其他地方的评论,似乎有两个选项。
System.Numerics.Vectors
https://msdn.microsoft.com/en-us/library/dn879696(v=vs.110).aspx#Anchor_4
NumPy和SciPy是Python中这类工作的流行选项,并已移植到.NET中 https://www.infoq.com/news/2011/07/NumPy-NET
关于这两个选项的优缺点和局限性的任何想法? System.Numerics.Vectors只能使用x86 x86吗? SciPy是否使用SIMD优化?
如果可以在C#中获得接近C ++ SIMD的性能而无需编写相同功能的几个版本(C ++,SSE2,AVX),那么这将具有很大的优势。它允许在不会使用它的地方进行SIMD优化。
Edit2:我无处可读NumPy和SciPy支持SIMD优化,因此System.Numerics.Vectors是可行的方法。
答案 0 :(得分:2)
SIMD指令仅支持a few data types,.NET 4.6附带的类型,或者您可以使用System.Numerics.Vectors NuGet包在.NET 4.5上获取它。
老实说,如果您有经验编写SSE2程序集或SIMD C ++代码,您可能会有更好的表现,并且应该坚持使用您最有经验的人。