原始内存流上的C#数学性能

时间:2016-07-24 02:03:17

标签: c# .net performance math

我考虑用C#而不是C ++编写视频处理库。 C ++的优点是可以在原始视频帧缓冲区上使用指针。 C#在该缓冲区上有一个可以来回寻找的MemoryStream。

数学公式需要逐个应用于每个像素;如果在C ++中使用程序集优化,则为8乘8或16乘16。

如何在C#中执行此操作与在C ++中执行此操作或使用SSE2程序集进行比较?

C#确实具有可以使用所有CPU特定指令(如AVX和AVX2)的优势,因为它可以即时进行最终编译,以及它的表现如何?

是否有针对此类任务从C#中获得最佳性能的最佳实践?

与指针相比,在MemoryStream中移动光标也会使语法更复杂。有没有办法简化这个?

编辑:基于此处和其他地方的评论,似乎有两个选项。

  1. System.Numerics.Vectors
    https://msdn.microsoft.com/en-us/library/dn879696(v=vs.110).aspx#Anchor_4

  2. NumPy和SciPy是Python中这类工作的流行选项,并已移植到.NET中 https://www.infoq.com/news/2011/07/NumPy-NET

  3. 关于这两个选项的优缺点和局限性的任何想法? System.Numerics.Vectors只能使用x86 x86吗? SciPy是否使用SIMD优化?

    如果可以在C#中获得接近C ++ SIMD的性能而无需编写相同功能的几个版本(C ++,SSE2,AVX),那么这将具有很大的优势。它允许在不会使用它的地方进行SIMD优化。

    Edit2:我无处可读NumPy和SciPy支持SIMD优化,因此System.Numerics.Vectors是可行的方法。

1 个答案:

答案 0 :(得分:2)

SIMD指令仅支持a few data types,.NET 4.6附带的类型,或者您可以使用System.Numerics.Vectors NuGet包在.NET 4.5上获取它。

老实说,如果您有经验编写SSE2程序集或SIMD C ++代码,您可能会有更好的表现,并且应该坚持使用您最有经验的人。