1

我目前正在使用 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 功能)

4

1 回答 1

2

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

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

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

于 2012-10-15T17:56:11.377 回答