第一个 cudaMalloc(K40 vs K20)的缓慢,即使在 cudaSetDevice 之后
slowness of first cudaMalloc (K40 vs K20), even after cudaSetDevice
我知道 CUDA 会在第一次 API 调用时进行初始化,但是花费的时间太多了。即使在单独的 cudaSetDevice
之后
测试程序:
相同的程序构建于:CUDA 7.0 (compute_35) + Visual Studio 2012 + NSight 4.5,然后在 2 台单独的机器中获得 运行(无需重建)
在第一个 cudaMalloc 之前,我调用了“cudaSetDevice”
在我的电脑上:Win7 + Tesla K20,第一个 cudaMalloc 需要 150 毫秒
我的服务器:Win2012+ Tesla K40,耗时1100ms!!
对于两台机器,后续的 cudaMalloc 都快得多。
我的问题是:
1,为什么 K40 为第一个 cudaMalloc 花费更长的时间(1100 毫秒对 150 毫秒)?因为K40应该比K20好
2、我以为"cudaSetDevice"可以捕获Init时间?例如This Answer from talonmies
3、如果初始化是不可避免的,进程A可以在GPU中保持其状态(或上下文)而进程B在同一GPU中运行ning吗?我知道我在 "exclusive" 模式下更好 运行 GPU,但是可以处理 A "suspend" 以便以后不需要再次初始化 GPU?
提前致谢
1, Why the K40 takes a much longer time (1100ms vs 150ms) for the 1st cudaMalloc? As K40 is supposed to be better than K20
未指定初始化过程的细节,但通过观察系统内存量影响初始化时间。 CUDA 初始化通常包括 UVM 的建立,这涉及协调设备和主机内存映射。如果您的服务器的系统内存比您的 PC 多,这是初始化时间差异的一种可能解释。 OS 也可能有影响,最后 GPU 的内存大小可能有影响。
2, I thought "cudaSetDevice" can capture the Init time? e.g. This Answer from talonmies
CUDA初始化过程是"lazy"初始化。这意味着将完成足够的初始化过程以支持请求的操作。如果请求的操作是 cudaSetDevice
,与请求的操作是 cudaMalloc
相比,这可能需要更少的初始化完成(这意味着所需的表观时间可能更短)。这意味着一些初始化开销可能被吸收到 cudaSetDevice
操作中,而一些额外的初始化开销可能被吸收到后续的 cudaMalloc
操作中。
3, If the initialization is unavoidable, can process A maintain its status(or context) in GPU while process B is running in the same GPU? I understand I better run GPU in "exclusive" mode, but can process A "suspend" so that it doesn't need to initialize GPU again later?
独立的主机进程通常会产生独立的 CUDA contexts。 CUDA 上下文具有与之关联的初始化要求,因此如果需要初始化新的 CUDA 上下文(可能来自单独的主机进程),那么另一个单独的 cuda 上下文可能已经在设备上初始化这一事实不会提供太多好处。通常,保持进程处于活动状态涉及在该进程中保持应用程序 运行。应用程序有多种机制来 "sleep" 或暂停行为。只要应用程序没有终止,该应用程序建立的任何上下文都不需要重新初始化(除非调用 cudaDeviceReset
)。
一般来说,通过设置 GPU 持久模式(使用 nvidia-smi
)允许 GPU 进入深度空闲模式的系统可以获得一些好处。然而,这与 GeForce GPU 无关,也与 windows 系统无关。
此外,在多 GPU 系统上,如果应用程序不需要多个 GPU,通常可以通过使用 CUDA_VISIBLE_DEVICES
environment variable 来避免一些初始化时间,以将 CUDA 运行时限制为仅使用必要的设备。
根据编译代码的目标体系结构和 运行 代码的体系结构,JIT 编译可以在第一次 cudaMalloc(或任何其他)调用时启动。 "If binary code is not found but PTX is available, then the driver compiles the PTX code."更多细节:
http://devblogs.nvidia.com/parallelforall/cuda-pro-tip-understand-fat-binaries-jit-caching/
我知道 CUDA 会在第一次 API 调用时进行初始化,但是花费的时间太多了。即使在单独的 cudaSetDevice
之后测试程序:
相同的程序构建于:CUDA 7.0 (compute_35) + Visual Studio 2012 + NSight 4.5,然后在 2 台单独的机器中获得 运行(无需重建)
在第一个 cudaMalloc 之前,我调用了“cudaSetDevice”
在我的电脑上:Win7 + Tesla K20,第一个 cudaMalloc 需要 150 毫秒
我的服务器:Win2012+ Tesla K40,耗时1100ms!!
对于两台机器,后续的 cudaMalloc 都快得多。
我的问题是:
1,为什么 K40 为第一个 cudaMalloc 花费更长的时间(1100 毫秒对 150 毫秒)?因为K40应该比K20好
2、我以为"cudaSetDevice"可以捕获Init时间?例如This Answer from talonmies
3、如果初始化是不可避免的,进程A可以在GPU中保持其状态(或上下文)而进程B在同一GPU中运行ning吗?我知道我在 "exclusive" 模式下更好 运行 GPU,但是可以处理 A "suspend" 以便以后不需要再次初始化 GPU?
提前致谢
1, Why the K40 takes a much longer time (1100ms vs 150ms) for the 1st cudaMalloc? As K40 is supposed to be better than K20
未指定初始化过程的细节,但通过观察系统内存量影响初始化时间。 CUDA 初始化通常包括 UVM 的建立,这涉及协调设备和主机内存映射。如果您的服务器的系统内存比您的 PC 多,这是初始化时间差异的一种可能解释。 OS 也可能有影响,最后 GPU 的内存大小可能有影响。
2, I thought "cudaSetDevice" can capture the Init time? e.g. This Answer from talonmies
CUDA初始化过程是"lazy"初始化。这意味着将完成足够的初始化过程以支持请求的操作。如果请求的操作是 cudaSetDevice
,与请求的操作是 cudaMalloc
相比,这可能需要更少的初始化完成(这意味着所需的表观时间可能更短)。这意味着一些初始化开销可能被吸收到 cudaSetDevice
操作中,而一些额外的初始化开销可能被吸收到后续的 cudaMalloc
操作中。
3, If the initialization is unavoidable, can process A maintain its status(or context) in GPU while process B is running in the same GPU? I understand I better run GPU in "exclusive" mode, but can process A "suspend" so that it doesn't need to initialize GPU again later?
独立的主机进程通常会产生独立的 CUDA contexts。 CUDA 上下文具有与之关联的初始化要求,因此如果需要初始化新的 CUDA 上下文(可能来自单独的主机进程),那么另一个单独的 cuda 上下文可能已经在设备上初始化这一事实不会提供太多好处。通常,保持进程处于活动状态涉及在该进程中保持应用程序 运行。应用程序有多种机制来 "sleep" 或暂停行为。只要应用程序没有终止,该应用程序建立的任何上下文都不需要重新初始化(除非调用 cudaDeviceReset
)。
一般来说,通过设置 GPU 持久模式(使用 nvidia-smi
)允许 GPU 进入深度空闲模式的系统可以获得一些好处。然而,这与 GeForce GPU 无关,也与 windows 系统无关。
此外,在多 GPU 系统上,如果应用程序不需要多个 GPU,通常可以通过使用 CUDA_VISIBLE_DEVICES
environment variable 来避免一些初始化时间,以将 CUDA 运行时限制为仅使用必要的设备。
根据编译代码的目标体系结构和 运行 代码的体系结构,JIT 编译可以在第一次 cudaMalloc(或任何其他)调用时启动。 "If binary code is not found but PTX is available, then the driver compiles the PTX code."更多细节:
http://devblogs.nvidia.com/parallelforall/cuda-pro-tip-understand-fat-binaries-jit-caching/