【发布时间】:2019-08-01 02:51:26
【问题描述】:
我们有数以百万计的小文件要由某些程序处理。
精确的程序并不重要,随着精确的任务而变化也。然而,这些都是较小的 C++ 程序,我们有源代码,但它们本质上不是可并行化的。
使用单个平均 CPU 内核(Intel i7 系列)时,处理一个小文件大约需要 15 秒。在程序运行时,它需要大约 200 MB 的 RAM。
我们希望在 GPU 上并行化,并在每个 GPU 核心(例如 Cuda 核心)上运行一个程序实例。因此,如果 GPU 有 3000 个 CUDA 核心,那么我们希望并行运行 3000 个实例。如果可能,我们希望使用像 OpenCL 这样的通用框架(而不是 Cuda,但如果这种情况需要 Cuda,那将是可以接受的)。
现在我们正在尝试评估这是否可行(我们在 GPGPU 编程方面还没有太多经验)。我们想象的主要问题是内存。如果我们并行运行 3000 个实例,每个实例需要 200 MB VRAM,那么我们将需要 600 GB 内存。
我们主要想到的显卡是高端 Geforce 卡,通常有 8 GB 到 11 GB 的内存。我们有 GPU 工作站,每个机箱/主板有 4 张卡,我们一开始希望将其用于此目的(但后来可能也用于其他 GPU 系统,因此我们更喜欢像 OpenCL 这样的通用框架)。
有哪些方法可以解决这个问题?
【问题讨论】:
-
在 3-5 个实例之后,内存带宽/延迟不会成为瓶颈吗?您将需要内核内部的伪malloc,以便它仅从已经cuda-malloced的全局缓冲区中为所有请求线程(当时)返回一个“合并的”地址组。如果实例没有以某种方式进行排序以减少它们之间的分支,即使这也可能不起作用。更好的方法是并行化你的算法,只运行足够的实例来重叠数据传输、文件读取和计算。
-
GPU 无法提供您建议的粒度级别,因此您不能这样做。
-
@huseyintugrulbuyukisik,感谢您的评论。我无法回答你的问题,但其他人可能会。
-
@talonmies:如果你的意思是粒度一种以我们想要的方式执行并行化的机制,如果这里没有可以支持我们的模块/包,我们可以自己编写这样的代码。问题是,它是否可行,即内存问题是否可以解决。
-
您无法在单个 GPU 内核上运行完整的程序。最接近完全支持一个或多个执行线程的是 CUDA GPU SM,而不是核心。
标签: parallel-processing cuda opencl gpgpu