运行 使用 OpenCL 在我的 GPU 上动态生成代码是个好主意,还是有更好的方法?
Is it a good idea to run dynamically generated code on my GPU with the use of OpenCL, or there are better ways?
简介
那么,让我介绍一个问题。目前,我正在用 C# 编写一个程序,其中有很多计算(更准确地说,它是一个神经网络库),到目前为止,我已经使用标准数组来存储矩阵,但我认为创建一个 2d 更好, 3d 矩阵 class 来封装我需要的所有矩阵操作,然后清理我的代码中的循环。
如您所知,使用基本的 operators overloading, but I came around another problem, it would be slower than regular for loops over arrays, as in the case you have a big equation, intermediate classes which are produced by overloading of operators may cause overhead. I googled it and found the article 很容易完成,这对我来说非常有用。简而言之,作者使用额外的 classes 首先创建一个方程树,然后使用 MSIL(Microsoft Intermediate Language)将其编译为 C# 方法一次求解方程。
但后来我想到了在我的 GPU 上进行 运行ning 矩阵计算的可能性,因为它会更快。我想出了一个 NuGet 包 Cloo,它使用 OpenCL 和 a wrapper for it(我希望它能在任何视频卡上工作,不仅是 NVidia 及其 CUDA)到你 GPU 上的 运行 C 代码,但它作为我刚才说它使用必须写成字符串的 C 代码。
问题
最后,我的问题。从方程树动态生成 C 代码字符串以在 GPU 上计算我的优化方程是个好主意,还是有其他方法可以实现。
首先,正确回答你的问题 - 实现两种方式并写下 benchmark。因为我们不知道,用什么GPU,用什么CPU,什么矩阵大小等等
理论上,如果您能够使用没有分支的 SIMD/SIMT 方法(例如没有 if
s),GPU 应该会更快。因此,如果您可以编写操作内部数组的平面代码,那么 GPU(事件嵌入)将工作得更快。然而,这里的主要词是理论上。
实际上:
- 。基于 Net(和基于 JVM)的代码更容易支持。
- OpenCL 代码对于 NVidia/AMD/Intel GPU 的工作方式不同(因为有时您可以在 local memory 中存储大量数据,有时不能;有时您可以依靠快速 GDDR6,有时依靠显卡(例如 - 嵌入式)仅共享计算机 RAM)。
- 一些 GPU 内存分析需要视频冻结(以减轻波动)。在 GPU 开发过程中,您还会有许多其他有趣的项目。
不过帮到你的是:
- 尝试Tensorflow Matrix multiplication first. It has .Net bindings,它可以在CPU和GPU上进行数学运算。
- 将 .Net 代码与本机代码进行比较,例如 - Rust/Kotlin Native/C++。也许您可以将所有计算移至本机部分(所有这些选项都比 OpenCL 编码和支持简单得多)。
- 从我的角度来看(抱歉,这里没有证据)用多种语言编写代码比从语言 Y 生成语言 X 的代码要简单得多。
简介
那么,让我介绍一个问题。目前,我正在用 C# 编写一个程序,其中有很多计算(更准确地说,它是一个神经网络库),到目前为止,我已经使用标准数组来存储矩阵,但我认为创建一个 2d 更好, 3d 矩阵 class 来封装我需要的所有矩阵操作,然后清理我的代码中的循环。
如您所知,使用基本的 operators overloading, but I came around another problem, it would be slower than regular for loops over arrays, as in the case you have a big equation, intermediate classes which are produced by overloading of operators may cause overhead. I googled it and found the article 很容易完成,这对我来说非常有用。简而言之,作者使用额外的 classes 首先创建一个方程树,然后使用 MSIL(Microsoft Intermediate Language)将其编译为 C# 方法一次求解方程。
但后来我想到了在我的 GPU 上进行 运行ning 矩阵计算的可能性,因为它会更快。我想出了一个 NuGet 包 Cloo,它使用 OpenCL 和 a wrapper for it(我希望它能在任何视频卡上工作,不仅是 NVidia 及其 CUDA)到你 GPU 上的 运行 C 代码,但它作为我刚才说它使用必须写成字符串的 C 代码。
问题
最后,我的问题。从方程树动态生成 C 代码字符串以在 GPU 上计算我的优化方程是个好主意,还是有其他方法可以实现。
首先,正确回答你的问题 - 实现两种方式并写下 benchmark。因为我们不知道,用什么GPU,用什么CPU,什么矩阵大小等等
理论上,如果您能够使用没有分支的 SIMD/SIMT 方法(例如没有 if
s),GPU 应该会更快。因此,如果您可以编写操作内部数组的平面代码,那么 GPU(事件嵌入)将工作得更快。然而,这里的主要词是理论上。
实际上:
- 。基于 Net(和基于 JVM)的代码更容易支持。
- OpenCL 代码对于 NVidia/AMD/Intel GPU 的工作方式不同(因为有时您可以在 local memory 中存储大量数据,有时不能;有时您可以依靠快速 GDDR6,有时依靠显卡(例如 - 嵌入式)仅共享计算机 RAM)。
- 一些 GPU 内存分析需要视频冻结(以减轻波动)。在 GPU 开发过程中,您还会有许多其他有趣的项目。
不过帮到你的是:
- 尝试Tensorflow Matrix multiplication first. It has .Net bindings,它可以在CPU和GPU上进行数学运算。
- 将 .Net 代码与本机代码进行比较,例如 - Rust/Kotlin Native/C++。也许您可以将所有计算移至本机部分(所有这些选项都比 OpenCL 编码和支持简单得多)。
- 从我的角度来看(抱歉,这里没有证据)用多种语言编写代码比从语言 Y 生成语言 X 的代码要简单得多。