我正在研究一个需要时间效率的代码,因此使用Cufft用于此目的,但是当我尝试并行计算非常大的数据的fft时,它比cpu fftw慢,并且我找到之后找到的原因使用高精度定时代码的每行代码的时间是cudamalloc大约需要0.983秒,而其余代码行的时间大约为0.00xx秒,这是预期的....
我已经完成了一些相关的帖子,但根据他们的说法
GPU的主要延迟是由于内存传输而非内存分配
并且在其中一篇文章中写道
对任何cuda库函数的第一次调用启动初始化子例程
这种延迟的实际原因是什么......或者在执行代码时有这样的延迟是不正常的???
先谢谢
答案 0 :(得分:4)
您看到的大延迟(接近1秒)是否可能是由于驱动程序初始化? cudaMalloc似乎相当长。还要检查您的驱动程序是否是最新的。
第一次内核启动的延迟可能是由多种因素造成的:
第一个仅适用于在没有X的Linux系统上运行的情况。在这种情况下,驱动程序仅在需要时加载并在之后卸载。以root身份运行nvidia-smi -pm 1
将以持久模式运行驱动程序以避免此类延迟,请查看man nvidia-smi
以获取详细信息,并记住将其添加到init脚本,因为它不会在重新启动时持续存在。
第二个延迟是为系统中的特定设备架构编译PTX。通过将二进制文件嵌入到可执行文件中(或者如果要支持多个arch而不编译PTX的架构),可以轻松避免这种情况。有关更多信息,请参阅CUDA C编程指南(可在NVIDIA website上获得),第3.1.1.2节讨论JIT编译。
第三点,即上下文创建,是不可避免的,但NVIDIA已经付出了巨大努力来降低成本。上下文创建涉及将可执行代码复制到设备,复制任何数据对象,设置内存系统等。
答案 1 :(得分:2)
这是可以理解的。 nvcc将ptx代码嵌入到应用程序二进制文件中,该文件必须使用JIT编译器编译为本机gpu二进制文件。这解释了启动延迟。 AFAIK malloc并不比memcpy慢。
同样正确的是,nvcc将cudaRegisterFatBinary和cudaRegisterFunction插入到您的代码中,以便在运行时注册内核及其入口点。我想这是你正在谈论的初始化。