如果 2 个或更多主机线程使用 cuda 运行时,你能告诉我 cuda 运行时如何选择 GPU 设备吗?
运行时是否为每个线程选择单独的 GPU 设备?
GPU设备是否需要明确设置?
谢谢
如果 2 个或更多主机线程使用 cuda 运行时,你能告诉我 cuda 运行时如何选择 GPU 设备吗?
运行时是否为每个线程选择单独的 GPU 设备?
GPU设备是否需要明确设置?
谢谢
是的,需要明确设置 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
以查找Compute Mode
您的 GPU。根据您使用的 CUDA 框架的版本,输出会有所不同。
基本上,为 GPU 设置了默认模式。它允许多个上下文在同一个 GPU 上交替运行。但是,每个上下文都必须显式释放 GPU:当一个上下文拥有 GPU 时,其他上下文会被阻塞一小段时间,然后在超时后被杀死。
要绕过此限制,您可以nvidia-smi -c
根据需要使用此显式值之一进行调用:
是的,GPU 设备需要明确设置。
一种简单的策略是将所有 GPU 设置为EXCLUSIVE_THREAD
(如 jopasserat 所示)。一个线程将遍历所有可用的 GPU 并尝试获取空闲的 GPU,直到成功。
在EXCLUSIVE_PROCESS
.
请参阅cuda 工具包文档中的3.4 计算模式。