我是CUDA和GPU编程的新手。我目前有2个CUDA应用程序(A.cu和B.cu),并希望分别运行它们并计算执行的总时间。但我想同时运行两个应用程序并检查执行时间。有没有办法做到这一点?
换句话说,如何同时从2个不同的应用程序同时启动两个内核,以便它们并行运行?
这方面的任何帮助都会有用。提前谢谢。
答案 0 :(得分:4)
如果您有2个GPU,则可以在一个GPU上启动一个应用程序(在一个进程中),在另一个GPU上启动一个应用程序(例如使用环境变量CUDA_VISIBLE_DEVICES。但是如果使用单个GPU,则可以启动两个GPU应用程序,但这些应用程序的内核将被序列化。也就是说,当一个应用程序的内核运行时,GPU将不会从另一个应用程序安排内核。
使用Hyper-Q功能可以在使用cc 3.5的GPU上避免此限制。公开此功能的一种方法是通过CUDA Multi-Process Server
但是,如果您不熟悉CUDA和GPU编程,那可能不是您想要的。此外,它需要Quadro或Tesla GPU。
要回答您的问题,要同时运行两个应用程序,请首先确保您的GPU设置为默认的计算模式。您可以使用nvidia-smi实用程序查询并修改此设置。如果它无法在您的GPU或" N / A"上设置,则它应该处于默认模式。
之后,您可以随意启动两个应用程序。他们应该找到并尝试使用GPU,但是内核的序列化可能无法为您提供所需的结果。
GPU的限制(例如全局内存大小)可能同时对两个应用程序生效。例如,如果每个应用程序都希望在GPU上分配1.5GB的内存,并且你有2GB的GPU,那么很可能一个应用程序的CUDA api函数(例如cudaMalloc
)将返回错误。
简而言之,特别是初学者,我无法想出你为什么要这样做的任何好理由。据推测,你是在追求更高水平的"并行度"但是当你从不同的linux进程启动内核时,你不会以简单的方式实现这一目标。