使用OpenCL在我的GPU上运行动态生成的代码是个好主意,还是有更好的方法?

问题描述 投票:1回答:1

简介

所以,让我介绍一个问题。目前,我正在用C#编写一个程序,其中包含大量计算(更确切地说是神经网络库),到目前为止,我已经使用标准数组存储矩阵,但是我认为创建2d更好。 ,3d矩阵类来封装我需要的所有矩阵运算,然后在代码中清理循环。

您可能知道,用基本的operators overloading很容易完成,但是我遇到了另一个问题,数组循环的速度比常规的慢,因为在您有一个大方程式的情况下,中间类操作员超负荷产生的操作可能会导致开销。我搜索了一下,发现the article对我来说非常有用。简而言之,作者使用其他类来首先创建方程式树,然后使用MSIL(Microsoft中间语言)以C#方法对其进行编译,从而立即求解方程式。

但是我想到了在我的GPU上运行矩阵计算的可能性,因为它将更快。我遇到了一个N​​uGet包Cloo,它使用OpenCL和a wrapper for it(我希望它不仅可以在具有CUDA的NVidia的任何视频卡上工作),还可以在您的GPU上运行C代码,但是正如我刚才所说的那样使用必须以字符串形式编写的C代码。

问题

最后,我的问题。从等式树动态生成C代码字符串以在GPU上计算优化的等式是个好主意,还是有其他方法可以实现。

c# matrix optimization calculation
1个回答
0
投票

首先,为您的问题提供正确答案-两种方法都实现并编写benchmark。因为我们不知道,使用了什么GPU,使用了什么CPU,什么矩阵大小,等等。

[理论上,如果您能够使用无分支的SIMD / SIMT方法(例如,无if的话),GPU应该更快。因此,如果您可以编写用于操作内部阵列的平面代码,则GPU(事件嵌入式)将运行得更快。但是,这里的主要词是理论上

实际上:

  • 基于.Net(和基于JVM)的代码更容易支持。
  • OpenCL代码在NVidia / AMD / Intel GPU上的工作方式不同(因为有时您可以在local memory中存储大量数据,有时却不能;有时可以依靠快速GDDR6,有时是视频卡(例如-嵌入式) )只共享计算机RAM)。
  • 某些GPU内存配置文件需要冻结视频(以减轻波动)。在GPU开发过程中,您还将有许多其他有趣的项目。

但是如何为您提供帮助:

  • 首先尝试Tensorflow Matrix multiplicationhas .Net bindings,可以在CPU和GPU上进行数学运算。
  • 例如,将.Net代码与本机进行比较-Rust / Kotlin本机/ C ++。也许您可以将所有计算移至本机部分(所有这些选项都比OpenCL编码和支持要简单得多)。
  • 从我的预期(这里没有证明,很抱歉),用多种语言编写代码比从语言Y以语言X生成代码要容易得多。
© www.soinside.com 2019 - 2024. All rights reserved.