1

很抱歉,如果这很明显,但我现在正在学习 c++ 和 Cuda,想知道这是否可行,以便我可以更多地关注相关部分。

基本上我的问题是高度可并行化的,事实上我目前正在多台服务器上运行它。我的程序得到一个工作项(非常小的列表)并在其上运行一个循环并做出 3 个决定之一:

  1. 保留数据(保存),
  2. 丢弃数据(不做任何事情),
  3. 进一步处理数据(它不确定要做什么,它会修改数据并将其重新发送到队列进行处理。

这曾经是一个递归,但我使每个部分独立,虽然我不再受一个 cpu 的约束,但它的负面影响是有很多消息来回传递。我大致了解 CUDA 的工作原理以及如何向其提交工作,但 CUDA 是否可以管理设备本身的队列?

我目前的想法是在 c++ 主机上管理队列,然后将处理发送到设备,然后将结果返回主机并发送回设备(依此类推)。我认为这可行,但我想看看是否可以让 CUDA 内存本身的队列和内核承担工作并将工作直接发送给它。

CUDA 是否可以实现类似的操作,或者有更好的方法吗?

4

1 回答 1

1

我认为您要问的是您是否可以在设备上保留中间结果。答案是肯定的。换句话说,您应该只需要将新的工作项复制到设备,并且只从设备复制完成的项目。仍未确定的工作项可以在内核调用之间保留在设备上。

您可能需要为此研究 CUDA Thrust。Thrust 具有高效的转换算法,可以与自定义逻辑相结合(在 Thrust 手册中搜索“kernel fusion”。)听起来您的处理可能被视为转换,您可以在其中获取工作项的向量并创建两个新向量,一个要保留的项目和一个仍未确定的项目。

主机是否知道(或可以监视)设备上的内存?我关心的是如何了解和处理开始超过 GPU 板载内存的数据。

可以从内核中分配和释放内存,但效率可能不会很高。相反,通过运行 CUDA 调用来管理内存,例如cudaMalloc()和,cudaFree()或者,如果您使用 Thrust,则在内核调用之间创建或调整向量的大小。

通过这种“手动”内存管理,您可以跟踪您使用了多少内存cudaMemGetInfo()

由于您会将完成的工作项复制回主机,因此您将知道设备上还剩下多少工作项,从而知道内核调用中可能需要的最大内存量是多少。

也许一个好的策略是为每个变换交换源向量和目标向量。举个简单的例子,假设您有一组要在多个步骤中过滤的工作项。您创建向量 A 并用工作项填充它。然后创建相同大小的向量 B 并将其留空。过滤后,A 中的部分工作项已移至 B,您就有了计数。现在再次运行过滤器,这次将 B 作为源,A 作为目标。

于 2012-05-06T06:10:43.573 回答