2011-07-13 50 views
3

我正在研究一个需要时间效率的代码,因此使用Cufft来达到这个目的,但是当我尝试并行计算非常大的数据的fft时,它比cpu fftw慢,以及找到时间后找到的原因对于使用高精度时间码的每一行代码是cudamalloc需要大约0.983秒,而其余的代码行的时间大约为0.00xx秒,这是预期的...cudamalloc比cudamemcpy慢吗?

我已经经历了一些相关的职位,但根据他们

与GPU的主要延误​​是由于内存的传输不内存分配

而且也是它被写的帖子一个

的第一个调用的任何CUDA库函数启动一个初始化子程序

这是什么延迟的实际原因......或者在执行代码时有这种延迟是不正常的吗?

在此先感谢

回答

4

是否有可能因为驱动程序初始化而导致大量延迟(接近1秒)?对于cudaMalloc来说似乎相当长。同时检查你的驱动程序是否是最新的。

第一个内核启动延迟可能是由于多种因素:

  1. 驱动程序初始化
  2. PTX汇编
  3. 上下文创建

其中第一项是唯一如果您在没有X的Linux系统上运行,则适用。在这种情况下,仅在需要时加载驱动程序,然后卸载。以root身份运行nvidia-smi -pm 1将以持久模式运行驱动程序以避免此类延迟,请查阅man nvidia-smi以获取详细信息,并记住将其添加到init脚本中,因为它不会在重新启动时持续存在。

第二个延迟是编译系统中特定设备体系结构的PTX。通过在设备体系结构中嵌入二进制文件(或架构,如果您希望支持多个文件夹而无需编译PTX),可以轻松避免这种情况。有关更多信息,请参见CUDA C编程指南(可从NVIDIA website获取),第3.1.1.2节讨论JIT编译。

第三点,上下文创建是不可避免的,但NVIDIA已经大力降低成本。上下文创建包括将可执行代码复制到设备,复制任何数据对象,设置内存系统等。

+1

你对进一步的调查是正确的,发现延迟只是在第一次调用任何cuda函数期间...而且由于我在VS 2008上工作,它很可能是由于PTX编译...将研究它详细...谢谢你的回复.. – snabbasi

+0

+1在我的Linux机器上(不运行X),执行'nvidia-smi -pm 1'消除了运行CUDA程序时的启动延迟。谢谢! –

2

这是可以理解的。 nvcc将ptx代码嵌入到应用程序二进制文件中,该二进制文件必须使用JIT编译器编译为本地gpu二进制文件。这说明了启动延迟。 AFAIK malloc不会比memcpy慢。

cudaRegisterFatBinary和cudaRegisterFunction也是由nvcc插入到您的代码中以注册您的内核及其运行时的入口点。我想这是你正在谈论的初始化。