Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 当代码多次启动时,处理时间缩短_C_Cuda_Nvidia - Fatal编程技术网

C 当代码多次启动时,处理时间缩短

C 当代码多次启动时,处理时间缩短,c,cuda,nvidia,C,Cuda,Nvidia,我目前正在使用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; 令我

我目前正在使用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秒

我真正关心的是VisualProfiler根据15次跑步计算统计数据,这使得我的第一次跑步被其他14次非常快的跑步所压倒

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

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

谢谢

编辑:


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

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

您可以为几个体系结构编译一个带有目标代码的“胖二进制文件”,其中在运行时选择了合适的代码版本。您甚至可以(而且应该!)包括PTX代码,以防任何目标代码版本都不适用(例如,支持未来的设备)


只需向nvcc提供多个
-gencode
选项,每个物理架构(“sm_20”)都有一个选项,您希望包含目标代码,并且至少有一个虚拟架构(“compute_20”)生成PTX代码。

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