2013-04-23 106 views
4

正如標題所說,當我跑我OpenCL內核整個屏幕停止重繪(直到我的程序與計算做監視器上顯示的圖像是一樣的。這是真實的,即使在情況下,我拔掉它從我的筆記本電腦中插回來 - 總是顯示相同的圖像),並且計算機似乎也不會對鼠標移動做出反應 - 光標停留在相同的位置。的OpenCL計算凍結屏幕

我不知道爲什麼會發生這種情況。它可能是我的程序中的一個錯誤,或者這是一個標準的行爲?

在Google上搜索時,我在AMD的論壇上發現了this線程,一些人認爲這很正常,因爲當GPU忙於計算時,它無法刷新屏幕。

如果這是真的,還有什麼辦法可以解決這個問題嗎?

我的內核計算可能需要幾分鐘的時間,並有我的電腦幾乎不能用於整個那段時間真的很痛苦。

EDIT1:這是我的當前設置:

  • 顯卡是ATI的Mobility Radeon HD 5650與512 MB的內存和最新的Catalyst測試版驅動程序從AMD網站
  • 顯卡可切換 - 英特爾集成/ ATI專用顯卡,但是 我禁用了在BIOS中的切換,否則我無法獲得在Ubuntu上運行的驅動程序 。
  • 操作系統是Ubuntu 12.10(64位),但是這也發生在Windows 7(64位)上。
  • 我有我的顯示器通過HDMI插入(但筆記本電腦屏幕凍結 太多,所以這不應該是一個問題)

EDIT2:所以我的代碼玩了一天後,我把意見從你的反應和改變了我的算法是這樣的(僞代碼):

for (cl_ulong chunk = 0; chunk < num_chunks; chunk += chunk_size) 
{ 
    /* set kernel arguments that are different for each chunk */ 
    clSetKernelArg(/* ... */); 

    /* schedule kernel for next execution */ 
    clEnqueueNDRangeKernel(cmd_queue, kernel, 1, NULL, &global_work_size, NULL, 0, NULL, NULL); 

    /* read out the results from kernel and append them to output array on host */ 
    clEnqueueReadBuffer(cmd_queue, of_buf, CL_TRUE, 0, chunk_size, output + chunk, 0, NULL, NULL); 
} 

所以現在我拆主機整體工作量和發送的塊到GPU。對於每一個數據塊我排隊一個新的內核,我得到的結果會以正確的偏移量附加到輸出數組。

這是你的意思,計算應該分開?

這似乎是解決凍結問題的方法,現在我可以處理比可用GPU內存大得多的數據,但我仍然不得不做出一些很好的性能測試,看看有什麼好處塊大小...

+0

你的配置是什麼? – 2013-04-23 18:51:03

+0

不知道你的配置是什麼意思,但我用我當前的硬件設置的信息更新了我的問題。 – jcxz 2013-04-23 19:33:21

+0

是的,你有正確的想法來劃分工作量。 – chippies 2013-04-26 13:26:48

回答

5

只要GPU運行OpenCL內核,它就完全專用於OpenCL。一些現代的Nvidia GPU是例外,我認爲從GeForce GTX 500系列開始,如果這些內核沒有使用所有可用的計算單元,它們可以運行多個內核。

您的解決方案是將您的計算劃分爲多個短內核調用,這是最好的全面解決方案,因爲它可以在單GPU機器上工作,或投資於便宜的GPU來驅動顯示器。

如果您要在GPU上運行長內核,那麼您必須禁用GPU的超時檢測和恢復,或者使超時延遲超過最大內核運行時間(最好能夠捕獲錯誤),請參見here去做這個。

+0

感謝您的回答和鏈接。我也看過它和我的寄存器,但是我唯一擁有的條目是'TdrDelay',它被設置爲60,這很有趣,因爲MSDN鏈接指出默認值是2秒,而我沒有記得改變其中的任何一個。而且,即使我的內核可以運行2-4分鐘(取決於輸入),我從來沒有經歷過我的應用程序的過早結束(這就是我認爲如果系統在GPU上殺死了我的內核,結果會如何)。儘管這麼長時間,結果仍然是正確的... ... – jcxz 2013-04-25 11:58:48

1

我是新來的opencl和遇到類似的問題。我發現一個簡短的計算工作正常,但更長的凍結鼠標光標。對於我的問題,Windows在托盤區域留下一個黃色三角形,並在事件日誌中顯示關於「顯示驅動程序停止響應並已恢復」的消息。我找到的解決方案是將計算分解成小部分,每部分只需幾秒鐘。這些跑回來,但顯然讓視頻驅動程序足以讓它感到高興。如果我將global_work_size設置爲足夠高以最大化吞吐量的值,則視頻響應速度會非常緩慢,但驅動程序重新啓動/鼠標凍結問題從不會發生。

+0

感謝您的回答,我查看了事件查看器,但我沒有發現任何警告或此類的痕跡。我用我的新算法的僞代碼編輯了我的問題。這是你打算如何分解計算? – jcxz 2013-04-25 12:02:31

2

每當我有一個顯示凍結或「顯示驅動程序停止響應並已恢復」,這是由於一個錯誤。它可以凍結整個系統,我唯一能做的就是重置。相反,現在我先在CPU上開發。這永遠不會崩潰我的整個系統。由於我可以使用printf,因此更容易調試。一旦我的代碼在CPU上運行,我就可以在GPU上嘗試它。

+0

感謝您的回答。其實內核應該沒問題,我在CPU上開發它,現在我試圖在GPU上運行它。此外,我的電腦沒有崩潰,只有重新啓動後才能恢復。只有視頻輸出會凍結,整個過程中我的內核處於活動狀態,但一旦完成,我的電腦就可以正常運行,甚至不會報告任何錯誤... – jcxz 2013-04-25 12:06:57

+0

祝您好運。如果您找到解決方案,請發佈。 – 2013-04-25 12:23:33