将 桌面主题 切换,导致CUDA程序运行速度降低了数十倍!

我的程序在window 7 主题下运行时1s多钟,可是最近我切换主题到window 经典主题下,程序运行到了10s多钟。变慢了数十倍。 CUDA程序运行会和桌面主题有关系么?求斑竹解答,谢谢。

楼主您好,我测试了下在Aero开启下(使用DirectX绘制桌面), 和关闭了Aero效果后,

未能发现显卡性能下降几十倍的效果。

请您再次确定此问题的确存在,并将您的时间图使用profiler跑的图给出(请不要使用任何大脑或者手工测时方式!谢谢)。

如果真的在开启/关闭了Aero后,性能下降几十倍,这个问题应该很多人反馈才对。
(但实际上我就是个例外,我尝试在aero和非aero下切换,未能感觉到性能察觉,更不要说“几十倍”了)

请按上述段落要求给出具体数据,以便支撑您的“慢了几十倍”的观点。

以及,在测试前,请关闭所有可能占用显卡,造成干扰的程序,

一个特例是adobe reader, 这个请关闭后测试。
(因为它有时会占据相当多的显存(几百MB甚至上G!), 如果您的算法需要自适应显存大小,这个可能会造成干扰,导致性能变化)

开启/关闭 Aero 确实对程序性能没有影响。 我的计时方式是在程序中用事件计时。 切换主题后显示程序运行时间确实慢了很多。
用profiler跑程序时,我的kernel本应该迭代6000次,可是在profiler中显示只迭代了4000多次。依据profiler分析的kernel时间来看,切换主题对性能好像没有影响。(GPU time 基本一致)。

问题1:采用事件计时是对整个程序计时,而profiler分析的GPU time是对GPU上的时间计时。
切换主题后,GPU time没有变化,但是整个程序的执行时间变慢了。

问题2:profiler中显示kernel函数迭代次数减少,是程序本身存在问题,还是别的什么问题。

菜鸟,问题如有不当请谅解。

(1)您的事件指的是cuda中的event? 这个记时要看您的2次实际对event进行record的时刻之间的差的,而不一定只是计算GPU的kernel或者CPU的代码的时间的,这个不一定(要看您具体怎么写)。

(2)“依据profiler分析的kernel时间来看,切换主题对性能好像没有影响。”
–嗯嗯。这个是应该的。

(3)您说您应该执行6000次kernel, 却在切换了windows主题后,只执行了4000次,这个真心不知道为何会导致如此。按理说不应该的。

根据您的2点来说,您的GPU时间无实际变化,至于为何会导致少执行了2000次,这个可能和您的代码有关。

此帖子的主题“关闭aero后导致cuda程序减速几十倍”不成立(楼主自证了),也请后来读者注意。

计时代码如下:

clock_t begin , end;
	double a;
	begin = clock();
	for (m_t=2;m_t<m_tnum+2;m_t++)	  // 6000次迭代,调用kernel函数
	{

		······
	}

	end = clock();
	a = (double)end-begin;
	cout<<"time ="<<a<<endl;
  1. 关闭/不关闭Aero 对程序确实没影响。我试过。 我做的是 切换主题,我不知道这两个是不是一样的。 我切换主题后,按以上的计时方式,程序确实慢了很多。

  2. 之前程序是正确的,执行了6000次。我修改后少了许多。怪我表述不清,这个问题和上一个问题没有关系:这个问题与切换主题没有关系。profiler提示:
    In this profiling session some profiler output rows are dropped when combining profiler output from multiple runs. Only the initial matching profiler output rows are kept. So the profiler output is incomplete.
    This can happen when the application execution differs across multiple runs.

Context_0:
Number of rows in first run = 6060
Number of rows dropped = 1704

我想知道是程序问题还是profiler或者别的问题。thx

楼主您好,您是在windows 7标准主题和windows经典主题间切换的,这会导致aero(以及桌面管理器)被打开或者关闭。

但这个不会影响您的实际性能。

因为此问题实际和标题无关,下面的讨论将偏离标题:

(1)用clock(),在host端计时是无效的(您在windows上目前可以用它来正确计算,但不能保证总是取得正确效果。在linux之类的上进行host端采用clock()计时,将总是错误的,但不排除将来可能偶然正确)(您可以在windows上使用QueryPerformanceCounter)
(2)可能您的多次profiler启动间,线程的形状之类的信息不正确。或者启动的多个不同kernel的顺不同。但因为您去掉了关键的对kernel的调用部分,导致只能大致如此推测。
以及,您最后同步了吗?如果没有,请考虑在您的循环结束加入cudaErrot_t = cudaDeviceSynchronize(); 以及cudaDeviceReset(); 以确保您的kernel正确执行完成了。

您只有多次按照同样的顺序,同样的配置启动kernel, 才能在多次运行后得到结果。(这个因为您没发代码,如果您已经这样做了,您可以只看上段最后的同步要求,可以忽略这句)

感谢来访,周末愉快。

周末愉快 非常感谢您的帮助和建议!