运行 每个 GPU 核心一个程序实例同时在所有 GPU 核心上运行
Running one instance of a program per GPU-core on all GPU-cores simultaneously
我们有数百万个小文件需要一些程序处理。
精确的程序并不重要,根据精确的任务也变化。然而,这些是较小的 C++ 程序,我们有源代码,但它们本质上不可并行化。
使用单个平均 CPU 内核(Intel i7 系列)处理一个小文件大约需要 15 秒。在程序 运行ning 期间,它需要大约 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 工作站,每个 case/mainboard 有 4 个卡,我们一开始想用它(但后来可能也用在其他 GPU 系统上,因此我们更喜欢像 OpenCL 这样的通用框架)。
有哪些方法可以解决这个问题?
The precise program is not important
这是一厢情愿的想法。您要解决的问题非常重要;如果它像将 C++ 代码重新编译为 GPU 着色器二进制文件一样简单,那么几乎所有软件都会这样做以免费提升速度。
您通常无法将整个 C++ 程序 1:1 转换为 GPU 内核,即使您设法做到了,它的性能也会非常糟糕。您确实需要努力根据 SIMD 类型的操作重新思考您的问题,以便使用 GPU 取得进展。
尤其是,您的印象似乎是每个 GPU "core" 都是独立的。事实并非如此,他们中的一些人以锁步方式工作,所以如果你的代码有很多分支,你的利用率就会很低。它们还共享内存总线,因此如果每个线程访问不相关的内存区域,这将大大减慢执行速度,并且您将无法足够快地喂养 ALU/FPU。
内存也是一个问题,但不仅仅是因为你指出的 VRAM 总量,还因为局部变量使用 "private" 内存,它们实际上是寄存器,而且非常重要资源有限(最多以千字节为单位)。
我建议查看所有主要 GPU 供应商发布的 OpenCL 优化指南。这将使您很好地了解哪种代码性能良好,哪些代码性能不佳,以及在决定将哪些代码卸载到 GPU 以及如何卸载时需要考虑哪些因素。
我们有数百万个小文件需要一些程序处理。
精确的程序并不重要,根据精确的任务也变化。然而,这些是较小的 C++ 程序,我们有源代码,但它们本质上不可并行化。
使用单个平均 CPU 内核(Intel i7 系列)处理一个小文件大约需要 15 秒。在程序 运行ning 期间,它需要大约 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 工作站,每个 case/mainboard 有 4 个卡,我们一开始想用它(但后来可能也用在其他 GPU 系统上,因此我们更喜欢像 OpenCL 这样的通用框架)。
有哪些方法可以解决这个问题?
The precise program is not important
这是一厢情愿的想法。您要解决的问题非常重要;如果它像将 C++ 代码重新编译为 GPU 着色器二进制文件一样简单,那么几乎所有软件都会这样做以免费提升速度。
您通常无法将整个 C++ 程序 1:1 转换为 GPU 内核,即使您设法做到了,它的性能也会非常糟糕。您确实需要努力根据 SIMD 类型的操作重新思考您的问题,以便使用 GPU 取得进展。
尤其是,您的印象似乎是每个 GPU "core" 都是独立的。事实并非如此,他们中的一些人以锁步方式工作,所以如果你的代码有很多分支,你的利用率就会很低。它们还共享内存总线,因此如果每个线程访问不相关的内存区域,这将大大减慢执行速度,并且您将无法足够快地喂养 ALU/FPU。
内存也是一个问题,但不仅仅是因为你指出的 VRAM 总量,还因为局部变量使用 "private" 内存,它们实际上是寄存器,而且非常重要资源有限(最多以千字节为单位)。
我建议查看所有主要 GPU 供应商发布的 OpenCL 优化指南。这将使您很好地了解哪种代码性能良好,哪些代码性能不佳,以及在决定将哪些代码卸载到 GPU 以及如何卸载时需要考虑哪些因素。