具有多个cpu线程的cuda设备选择

时间:2010-04-17 15:30:18

标签: multithreading cuda gpu host

如果2个或更多主机线程使用cuda运行时,你能告诉我cuda运行时如何选择GPU设备吗?

运行时是否为每个线程选择单独的GPU设备?

是否需要明确设置GPU设备?

由于

3 个答案:

答案 0 :(得分:7)

是的,需要明确设置GPU设备,否则将使用默认设备(通常是设备0)

请记住,一旦运行时开始使用一个设备,在同一个线程中调用的所有函数都将固定到该设备。

我发现在启动线程时有用的东西是

cudaThreadExit(); // clears all the runtime state for the current thread
cudaSetDevice(deviceId); // explicit set the current device for the other calls
cudaMalloc
cudaMemcpy
etc.. 

编程指南有一章专门介绍它。

答案 1 :(得分:5)

这取决于GPU的设置模式。

致电nvidia-smi -q查找您的GPU的Compute Mode。根据您使用的CUDA框架的版本,输出将不同。

基本上,为GPU设置默认模式。它允许多个上下文在同一GPU上交替运行。但是,每个上下文必须显式释放GPU:当上下文拥有GPU时,其他内容会被短时间阻止,然后在超时后被杀死。

要绕过此限制,您可以使用此显式值之一调用nvidia-smi -c,具体取决于您的需求:

  • DEFAULT
  • EXCLUSIVE_THREAD
  • PROHIBITED
  • EXCLUSIVE_PROCESS

答案 2 :(得分:1)

是的,需要明确设置GPU设备。

一个简单的策略是将所有GPU设置为EXCLUSIVE_THREAD(如jopasserat所示)。一个线程将遍历所有可用的GPU并尝试获取一个免费的GPU,直到它成功。

EXCLUSIVE_PROCESS的情况下,相同的机制可以正常工作。

请参阅cuda工具包文档中的3.4 compute modes