现象
近期使用MindSpore发现,第一次运行GPU代码需要5分钟左右才出结果。
复现步骤
参照 官网安装教程, 安装GPU 1.9.0版本,运行如下测试代码:
等待5分钟后才出现如下结果:
原因解释
nvcc编译分为两级,根据编译指令的不同,首先在第一阶段编译出面向虚拟架构(virtual architecture)的ptx代码,然后在第二阶段将ptx代码编译成面向实际架构(real architecture)的二进制文件。
不同的架构包含了不同的功能,架构代码号越高,包含的功能越多。在向nvcc指定架构时,我们所指定的实际架构代码必须兼容于所指定的虚拟架构代码。
在运行时,若二进制代码可直接运行在所在显卡上,则直接运行二进制代码;否则,若文件中包含虚拟架构代码,显卡驱动会尝试将虚拟架构代码在编译时动态编译为二进制代码进行执行(JIT)。(耗时也就是这部分,取决于需要编译的内容大小。在早期这部分算子数量不大,因此耗时无感知,随着MindSpore GPU算子的增加,该部分的耗时逐渐显现。)
解决方案
方案 1
可尝试扩大编译缓存(生成位置一般在~/.nv/ComputeCache/,在账号目录下,因此不同账号可能表现不同)。部分场景不仅是第一次执行慢,后续执行也慢,可能原因是缓存不够,导致每次都需要及时生成。
方案 2
本地编译MindSpore代码,参照官网Source安装,编译是会根据当前显卡架构以及CUDA版本编译合适的cubin文件,后续加载即使用,无需在经过二次编译。
现象
近期使用MindSpore发现,第一次运行GPU代码需要5分钟左右才出结果。
复现步骤
参照 官网安装教程, 安装GPU 1.9.0版本,运行如下测试代码:
等待5分钟后才出现如下结果:
原因解释
nvcc编译分为两级,根据编译指令的不同,首先在第一阶段编译出面向虚拟架构(virtual architecture)的ptx代码,然后在第二阶段将ptx代码编译成面向实际架构(real architecture)的二进制文件。
不同的架构包含了不同的功能,架构代码号越高,包含的功能越多。在向nvcc指定架构时,我们所指定的实际架构代码必须兼容于所指定的虚拟架构代码。
在运行时,若二进制代码可直接运行在所在显卡上,则直接运行二进制代码;否则,若文件中包含虚拟架构代码,显卡驱动会尝试将虚拟架构代码在编译时动态编译为二进制代码进行执行(JIT)。(耗时也就是这部分,取决于需要编译的内容大小。在早期这部分算子数量不大,因此耗时无感知,随着MindSpore GPU算子的增加,该部分的耗时逐渐显现。)
解决方案
方案 1
可尝试扩大编译缓存(生成位置一般在~/.nv/ComputeCache/,在账号目录下,因此不同账号可能表现不同)。部分场景不仅是第一次执行慢,后续执行也慢,可能原因是缓存不够,导致每次都需要及时生成。
方案 2
本地编译MindSpore代码,参照官网Source安装,编译是会根据当前显卡架构以及CUDA版本编译合适的cubin文件,后续加载即使用,无需在经过二次编译。