【问题标题】:Processing Time reduced when code launched several times多次启动代码时处理时间减少
【发布时间】:2012-10-15 14:23:54
【问题描述】:

我目前正在使用 C 和 CUDA 编写应用程序。 我有在纯 C 中工作的算法并将其转换为 CUDA。

结果很好,我现在正在优化我的代码。

我使用一个简单的方法来分析内核获取结果所需的时间

clock_t start, end;
double cpu_time_used;
start = clock();

. . . my memcopies and my kernel . . . 

end = clock();
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;

让我吃惊的是,当我连续多次运行整个程序时,处理时间大大减少了。 当只运行一次时,我平均大约 0.9 秒。连续运行十次我可以减少到 0.1 秒。

我真正担心的是,Visual Profiler 会根据 15 次运行计算其统计数据,这使得我的第一次运行被非常快的其他 14 次运行所压倒。

我的程序稍后会偶尔运行一次,所以我要优化的是第一次运行的时间。

因此,我的问题是,有没有办法解决这个问题,或者知道它来自哪里?

谢谢!

编辑:

我在上网本上运行 Windows 7、CUDA 4.2 Toolkit(2.1 功能)

【问题讨论】:

  • 而不是每次运行执行一次任务;如果可行的话,循环执行数百次。计时并观察平均吞吐量。我猜内存缓存...
  • 随机猜测,但如果您在现代操作系统上运行,它们具有非常好的缓存系统(例如 TurboBoost)。我只是在这里抓住稻草,但如果可能的话,我会尝试关闭其中的任何一个(我假设你的程序在运行之间完全从内存中清除)
  • Linux 还是 Windows?您是否在驱动程序中设置了持久性模式?使用 nvidia-smi
  • GPU 中的第一次内存分配和第一次内核调用由于初始化目的而具有开销。人们通常做的是创建一个虚拟内核,例如,初始化一个数组,然后获取他们整个应用程序的时间。
  • 这在基准测试中并不少见;通常会有某种类型的初始化(无论是加载缓存、JIT 代码、初始化库、启动磁盘,你有什么),这需要有限的时间,这会拖累第一次运行的时间,然后在很大程度上消失.您经常会听到术语“冷启动”或“热启动”来分别区分会产生或不产生初始化成本的基准。使用任一时间都是合理的,具体取决于与您的案例相关的内容,只要您清楚自己的时间。

标签: c cuda nvidia


【解决方案1】:

如果您的目标是提供快速启动,请确保您的可执行文件包含将在其上运行的 GPU 架构的目标代码。

您可以为多种架构编译带有目标代码的“胖二进制文件”,其中在运行时选择合适的代码版本。您甚至可以(并且应该!)包含 PTX 代码,以防没有目标代码版本适合(例如,支持未来的设备)。

只需向 nvcc 提供多个-gencode 选项,一个用于您要为其包含目标代码的每个物理架构(“sm_20”),以及至少一个具有虚拟架构(“compute_20”)的选项,以生成 PTX代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-12
    • 2013-08-29
    • 1970-01-01
    • 2017-07-23
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多