将进程锁定到 Cuda 核心

Locking a process to Cuda core

我刚刚进入 GPU 处理。

我想知道是否可以锁定一个新进程,或者'launch'一个锁定到CUDA核心的进程?

例如,您可能有一个对图像索引执行图像过滤的小型 C 程序。您能否在每个 CUDA 内核上安装该程序 运行,它基本上永远运行 - reading/writing 从它自己的内存到系统内存和磁盘?

如果可行,对 CPU 性能有何影响 - 我们能否完全抵消 CPU 的使用,或者 CPU 是否仍需要一些 input/output ?

我这里的语义可能有偏差。如果我所说的需要一些解释,我深表歉意。我还不太习惯 GPU 的东西。

谢谢。

我在这里的所有评论都应该以 "at the moment" 开头。技术在不断发展。

was wondering if it's possible to lock a new process, or 'launch' a process that is locked to a CUDA core?

process 主要是一个(主机)操作系统术语。 CUDA 没有将 process 与它的主机操作系统定义分开定义,AFAIK。 CUDA threadblocks,一旦在今天 Streaming Multiprocessor (or SM, a hardware execution resource component inside a GPU), in many cases will stay on that SM for their "lifetime", and the SM includes an array of "CUDA cores" (a bit of a loose or conceptual term). However, there is at least one documented exception 上启动,在 CUDA 动态并行的情况下,所以在最一般意义上,不可能 "lock"到 CUDA 核心的 CUDA 执行线程(此处使用核心指的是永远保留在 SM 内给定经线通道上的执行线程)。

Can you have that program running on each CUDA core that essentially runs forever

您可以拥有一个基本上永远运行的 CUDA 程序。这是一种公认​​的编程技术,有时称为 persistent threads。这样的程序自然会 occupy/require 一个或多个 CUDA 核心(再次,松散地使用该术语)。如前所述,这可能暗示也可能不暗示程序永久占用特定组物理执行资源。

reading/writing from it's own memory to system memory

是的,这是可能的,延伸思路。根据定义,写入它自己的内存显然是可能的,并且可以通过 zero-copy mechanism(幻灯片 21/22)写入系统内存,前提是对该机制进行了适当设置 activity 的合理假设。

and disk?

不,如果没有主机系统交互,and/or 没有对非典型外部资源的重大假设,例如通过 GPUDirect 接口连接的某种磁盘控制器(有很多额外的假设和未指定的框架)。 GPUDirect 异常需要很多额外的框架,我想说,对于典型用法,答案是 "no",而不是没有主机系统 activity/intervention。主机系统(通常)拥有磁盘驱动器,而不是 GPU。

If this is possible, what are the implications for CPU performance - can we totally offset CPU usage or does the CPU still need to have some input/output?

在我看来,CPU还是要考虑的。一个考虑因素是您是否需要写入磁盘。即使您不这样做,大多数程序也会从某个地方(例如 MPI)派生 I/O,因此存在某种更大框架的含义。其次,与此相关的是,持久线程编程模型通常意味着 producer/consumer 关系和工作队列。 GPU 在工作队列的处理端(消费者端),但其他东西(通常)在生产者端,通常是主机系统 CPU。同样,它可能是另一个 GPU,无论是本地的还是通过 MPI,它位于工作队列的生产者端,但这通常仍然意味着最终生产者位于其他地方(即需要系统 I/O)。

另外:

Can CUDA threads send packets over a network?

这就像磁盘问题。这些问题可以笼统地看待,在这种情况下,答案可能是 "yes"。但将我们自己限制在 CUDA 线程可以做什么的正式定义上,我相信答案更合理 "no"。 CUDA 没有为 I/O 磁盘或网络接口(或许多其他东西,例如显示器!)提供直接定义。推测或假设存在一个轻量级主机进程是合理的,它只是在 CUDA GPU 和网络接口之间复制数据包。根据这个假设,答案可能是 "yes"(对于磁盘 I/O 也是如此)。但如果没有这个假设(and/or 一个相关的,也许更涉及 GPUDirect 框架的假设),我认为最合理的答案是 "no"。根据CUDA编程模型,没有定义如何直接访问磁盘或网络资源。