【发布时间】:2011-02-09 04:13:13
【问题描述】:
如果有 2 个或更多主机线程使用 cuda 运行时,你能告诉我 cuda 运行时如何选择 GPU 设备吗?
运行时是否为每个线程选择单独的 GPU 设备?
GPU 设备是否需要明确设置?
谢谢
【问题讨论】:
标签: multithreading cuda gpu host
如果有 2 个或更多主机线程使用 cuda 运行时,你能告诉我 cuda 运行时如何选择 GPU 设备吗?
运行时是否为每个线程选择单独的 GPU 设备?
GPU 设备是否需要明确设置?
谢谢
【问题讨论】:
标签: multithreading cuda gpu host
是的,需要明确设置 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..
编程指南有一章专门介绍它。
【讨论】:
这取决于设置 GPU 的模式。
致电nvidia-smi -q 查找您的GPU 的Compute Mode。根据您使用的 CUDA 框架的版本,输出会有所不同。
基本上,为 GPU 设置了默认模式。它允许多个上下文在同一个 GPU 上交替运行。但是,每个上下文必须显式释放 GPU:当一个上下文拥有 GPU 时,其他上下文会被阻塞一小段时间,然后在超时后被终止。
要绕过此限制,您可以根据需要使用此显式值之一调用nvidia-smi -c:
【讨论】:
是的,GPU 设备需要明确设置。
一个简单的策略是将所有 GPU 设置为 EXCLUSIVE_THREAD(如 jopasserat 所示)。一个线程将遍历所有可用的 GPU 并尝试获取空闲的 GPU,直到成功为止。
在EXCLUSIVE_PROCESS 的情况下,同样的机制可以正常工作。
请参阅 cuda 工具包文档中的 3.4 compute modes。
【讨论】: