【发布时间】: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 代码、初始化库、启动磁盘,你有什么),这需要有限的时间,这会拖累第一次运行的时间,然后在很大程度上消失.您经常会听到术语“冷启动”或“热启动”来分别区分会产生或不产生初始化成本的基准。使用任一时间都是合理的,具体取决于与您的案例相关的内容,只要您清楚自己的时间。