如果2个或更多主机线程使用cuda运行时,你能告诉我cuda运行时如何选择GPU设备吗?
运行时是否为每个线程选择单独的GPU设备?
是否需要明确设置GPU设备?
由于
答案 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
,具体取决于您的需求:
答案 2 :(得分:1)
是的,需要明确设置GPU设备。
一个简单的策略是将所有GPU设置为EXCLUSIVE_THREAD
(如jopasserat所示)。一个线程将遍历所有可用的GPU并尝试获取一个免费的GPU,直到它成功。
在EXCLUSIVE_PROCESS
的情况下,相同的机制可以正常工作。
请参阅cuda工具包文档中的3.4 compute modes。