Parallel processing 在所有GPU内核上同时运行每个GPU内核的一个程序实例

Parallel processing 在所有GPU内核上同时运行每个GPU内核的一个程序实例,parallel-processing,cuda,opencl,gpgpu,Parallel Processing,Cuda,Opencl,Gpgpu,我们有数百万个小文件需要一些程序处理 精确的程序并不重要,并且随着精确的任务而变化。然而,这些都是较小的C++程序,我们有源代码,但它们本质上是不可并行的 使用单个平均CPU核心Intel i7系列时,处理一个小文件大约需要15秒。程序运行时需要大约200 MB的RAM 我们希望在GPU上并行化,并在每个GPU核心(例如Cuda核心)上运行该程序的一个实例。因此,如果GPU有3000个CUDA内核,那么我们希望并行运行3000个实例。如果可能的话,我们希望使用像OpenCL这样的通用框架,而不是

我们有数百万个小文件需要一些程序处理

精确的程序并不重要,并且随着精确的任务而变化。然而,这些都是较小的C++程序,我们有源代码,但它们本质上是不可并行的

使用单个平均CPU核心Intel i7系列时,处理一个小文件大约需要15秒。程序运行时需要大约200 MB的RAM

我们希望在GPU上并行化,并在每个GPU核心(例如Cuda核心)上运行该程序的一个实例。因此,如果GPU有3000个CUDA内核,那么我们希望并行运行3000个实例。如果可能的话,我们希望使用像OpenCL这样的通用框架,而不是Cuda,但是如果这种情况需要Cuda,这是可以接受的

现在我们正在尝试评估这是否可能,我们还没有多少GPU编程经验。我们想象的主要问题是记忆。如果我们并行运行3000个实例,每个实例将需要200 MB的VRAM,那么我们将需要600 GB的内存

我们主要考虑的图形卡是高端Geforce卡,通常有8GB到11GB的内存。我们有GPU工作站,每个机箱/主板有4个卡,我们想先用它,但后来可能也会用在其他GPU系统上,因此我们更喜欢像OpenCL这样的通用框架

有哪些方法可以解决这个问题

精确的程序并不重要

这是一厢情愿。你试图解决的问题非常重要;如果它简单地像重新编译C++代码到GPU着色器二进制文件一样,几乎所有的软件都会为自由速度提升而做。

你通常不能将整个C++程序1:1转换成GPU内核,即使你设法做到了,它也会执行得非常糟糕。您确实需要重新思考SIMD类型操作方面的问题,以便使用GPU取得成功

特别是,您似乎觉得每个GPU核心都是独立的。但事实并非如此,一组代码是同步工作的,因此,如果您的代码是大量分支代码,那么您的利用率将非常低。它们还共享内存总线,因此如果每个线程访问不相关的内存区域,这将大大降低执行速度,并且无法足够快地向ALU/FPU提供数据

内存也是一个问题,但这不仅仅是因为您指出的VRAM总量,还因为本地变量使用私有内存,而私有内存实际上是寄存器,充其量是以千字节为单位的有限资源


我建议查看所有主要GPU供应商发布的OpenCL优化指南。这将让您很好地了解什么样的代码性能好,什么不好,以及在决定将哪些代码卸载到GPU以及如何卸载时需要考虑哪些因素。

仅3-5个实例之后,内存带宽/延迟不是瓶颈吗?在内核中需要一个伪malloc,以便它只返回所有请求线程的一组合并地址,该地址来自已经存在的cuda malloced全局缓冲区。如果实例的排序方式不是为了减少它们之间的分支,那么即使这样也可能不起作用。更好的方法是并行化您的算法,只运行足够的实例来重叠数据传输、文件读取和计算。GPU不提供您建议需要的粒度级别,所以不,您不能这样做。@huseyintugrulbuyukisik,谢谢您的评论。我不能回答你的问题,但其他人可能会。@Talonmes:如果你的意思是以我们想要的方式执行并行化的粒度机制,那么如果这里没有支持我们的模块/包,我们可以自己编写这样的代码。问题是,它是否可行,即内存问题是否可以解决。你不能在一个GPU内核上运行一个完整的程序。最能完全支持一个或多个执行线程的是CUDA GPU SM,而不是core。非常感谢您的回答,它非常有帮助。我已根据您的信息更正了我的上述问题,即删除了该计划不重要的声明。关于你的陈述,如果它是。。。几乎所有的软件都会这样做以实现免费的速度提升,也许我们应该在这里补充一点,所有有大量独立任务要执行的软件都可以这样做,但大多数软件都不是这样。@Jadzia许多软件都可以适应GPU加速。然而,生成的代码通常与原始代码完全不同,在许多情况下,必须彻底重新考虑算法。所以我不确定你的most软件声明;一般来说,可能是大多数软件,但可能不是CPU受限的大多数软件。 你没有提供足够的细节来告诉我你在做什么,这是否适用于你的软件。即使是一些传统的串行工作负载,如压缩,如果考虑足够的话,通常也可以从GPU加速中获益。