在VB.NET中进行GPU处理

3
我是一位能翻译文本的助手。
我已经拥有一个程序,需要大约24小时才能运行完。该程序使用VB.net编写,共计2000多行代码。程序已经实现了多线程,效果良好(虽然也经过了不少辛酸泪水)。通常我会使用10个线程来运行程序,但我想增加线程数量以减少处理时间,这时就可以考虑使用GPU来处理。我在谷歌上搜索了所有相关信息,可惜没有得到结果。
我希望能够获得一个基本示例的VB.net项目,用于进行一些普通操作,然后将一些线程发送到GPU进行处理。最好不要收费。类似如下:
```vb.net ' VB.net 示例代码 ' 运行某些普通操作 Dim data As List(Of Integer) = GetData() ' 将数据发送给 GPU 处理 Dim result As List(Of Integer) = GpuProcess(data) ' 处理结果 HandleResult(result) ```
'Do some initial processing eg.
dim x as integer
dim y as integer
dim z as integer
x=int(textbox1.text)
y=int(textbox2.text)
z=x*y
'Do some multi-threaded operations on the gpu eg.
'show some output to the user once this has finished.

任何帮助或链接将不胜感激。我已经阅读了很多关于c ++和其他语言的文章,但我不擅长理解其他语言!
谢谢大家!
弗雷泽

1
它可能会让你的生活变得更轻松,但也会使代码变得慢得多(!!!)。关于使用GPU:我怀疑VB没有解决方案。Mono在其核心库中有一些SIMD模块,但没有通用GPU编程的内容,因为通常更容易只加载实现GPU逻辑的C++库。在VB中具有本地GPU编程并不能为您带来任何好处,并且GPU的抽象与.NET框架设计不相容。 - Konrad Rudolph
1
其他“支持”使用GPU的语言需要特殊编译器。例如,C++实际上并不支持GPGPU编程。如果您想在C++中使用CUDA进行GPGPU编程,则需要使用不同的编译器(nvcc)来编译GPU代码。 - Konrad Rudolph
1
显然,nvcc编译器需要知道如何解析源语言,并且它期望(一种有限的子集)C ++作为源语言。 - Konrad Rudolph
好的,我将此问题标记为已回答。我已经提出了另一个相关的问题,请查看一下,我相信你能够帮助!谢谢! - FraserOfSmeg
哇,使用Cudaify很好啊。我之前可能是错的。真是强大的东西。祝你好运。 - Konrad Rudolph
显示剩余4条评论
1个回答

4
VB.NET编译器不会直接编译到GPU,而是编译成中间语言(IL),然后在运行时针对目标架构进行即时编译(JIT)。目前仅支持x86、x64和ARM目标。CUDAfy(见下文)将IL转换为CUDA C代码。然后使用NVCC编译它以生成GPU可以执行的代码。请注意,这意味着您只能使用NVidia GPU,因为CUDA不支持AMD。还有其他采用相同方法的项目,例如Copperhead中的Python到CUDA翻译器。 CUDAfy- 在CUDA API上包装了额外的库,如FFT等。还有一个商业版本。这实际上是一个CUDAfy翻译器,使用SharpDevelop的反编译器ILSpy作为基础,将.NET代码转换为CUDA C。
还有其他项目可以让您从.NET语言中使用GPU。例如:

NMath - 一组数学库,可用于.NET并启用GPU。

可能还有其他的库,但这些似乎是主要的。如果您决定使用CUDAfy,则仍需要投入一些时间来了解足够的CUDA知识以及GPU如何工作,以将算法移植到适合GPU数据并行模型中。除非可以在一个数学库中直接完成。

重要的是要认识到,从.NET语言访问GPU仍会有性能损失。您必须为从.NET托管运行时移动(调度)数据到本地运行时付出代价。这里的开销很大程度上取决于数据的大小和类型,以及是否可以进行无需转换的调度。这还加上了从CPU到GPU等移动数据的成本。


哇,您回答了一个将近一年前的问题。您所建议的是我已经做过的,正如您提到的数据传输到/从GPU的速度很慢,以至于比之前的代码更慢。感谢您的答案! - FraserOfSmeg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接