【发布时间】:2012-05-13 06:06:11
【问题描述】:
我正在开发一个需要无限期运行 CUDA 内核的应用程序。我有一个 CPU 线程将 stg 写入列表,而 gpu 读取该列表并重置(至少在开始时)。当我在内核中写代码时
while(true)
{
//kernel code
}
系统挂断。我知道 GPU 仍在处理,但当然没有任何反应。而且我不确定列表中的重置是否会发生。
不得不提的是,用于计算的GPU不用于显示,所以没有看门狗问题。
操作系统是 Ubuntu 11.10 和 cuda 工具包 4.1。 我可以使用任何帮助/示例/链接来成功编写无限内核。
【问题讨论】:
-
CUDA 调度程序在处理无限循环、自旋锁等方面确实很糟糕,因为这些“对象”对于 GPU 架构来说是完全陌生的。更常见和可预测的方法是偶尔运行一次内核以检查是否出现了新元素。
-
另外,新元素不能随便出现。你必须把它们放在那里。所以你知道什么时候需要重新运行内核。
-
当内核运行时,高端 GPU 的功耗可能会增加 250W,因此通过选择何时运行内核可以节省资金。也更环保。
-
"无限内核对于当前项目是强制性的。目标是一个 gpu 控制器,因此 gpu 必须在没有 cpu 干扰的情况下自主工作(当然内核调用除外)。"你的整个想法听起来完全有缺陷 IMO。你应该回去仔细重新考虑一下。记住我之前所说的:新元素不能随便出现。你必须把它们放在那里。所以你知道什么时候需要重新运行内核。
-
对于您的问题,您希望在后台运行一个完整的进程或至少一个线程,而不仅仅是一个 CUDA 内核。