所以,让我介绍一个问题。目前,我正在用C#编写一个程序,其中包含大量计算(更确切地说是神经网络库),到目前为止,我已经使用标准数组存储矩阵,但是我认为创建2d更好。 ,3d矩阵类来封装我需要的所有矩阵运算,然后在代码中清理循环。
您可能知道,用基本的operators overloading很容易完成,但是我遇到了另一个问题,数组循环的速度比常规的慢,因为在您有一个大方程式的情况下,中间类操作员超负荷产生的操作可能会导致开销。我搜索了一下,发现the article对我来说非常有用。简而言之,作者使用其他类来首先创建方程式树,然后使用MSIL(Microsoft中间语言)以C#方法对其进行编译,从而立即求解方程式。
但是我想到了在我的GPU上运行矩阵计算的可能性,因为它将更快。我遇到了一个NuGet包Cloo,它使用OpenCL和a wrapper for it(我希望它不仅可以在具有CUDA的NVidia的任何视频卡上工作),还可以在您的GPU上运行C代码,但是正如我刚才所说的那样使用必须以字符串形式编写的C代码。
最后,我的问题。从等式树动态生成C代码字符串以在GPU上计算优化的等式是个好主意,还是有其他方法可以实现。
首先,为您的问题提供正确答案-两种方法都实现并编写benchmark。因为我们不知道,使用了什么GPU,使用了什么CPU,什么矩阵大小,等等。
[理论上,如果您能够使用无分支的SIMD / SIMT方法(例如,无if
的话),GPU应该更快。因此,如果您可以编写用于操作内部阵列的平面代码,则GPU(事件嵌入式)将运行得更快。但是,这里的主要词是理论上。
实际上:
但是如何为您提供帮助: