2017-11-25 129 views
-1

我有一個很大的代碼庫,可以通過CUDA內核執行RGB到YUV的顏色轉換。由於我正在進行大量的並行轉換,因此我使用了流(可能與此處相關)。該代碼在Linux上運行,它在Quadro K4200 GPU上運行良好,但最近我有一個新的Quadro P4000 GPU,在撥打cudaDeviceSynchronize()時,我經常獲得cudaErrorUnknown。在發生這種情況之前,我所做的唯一事情就是調用cuMemcpy2DAsync來複制像素數據,然後調用我的內核。代碼庫很大,我可以分享一些相關的部分,但任何人都可以給我建議,我該如何解決這個問題?由於我一直在使用K4200,所以我沒有更改CUDA編譯器標誌。我應該這樣做嗎?我目前編譯相同的代碼與下面的標誌牌都:如何解決從cudaDeviceSynchronize()cudaErrorUnknown?

--compiler-bindir /usr/bin/gcc-4.9 -gencode=arch=compute_30,code=\"sm_30,compute_30\" -cudart static -maxrregcount=0 --machine 64 --compile -g -G -std=c++11 -D_MWAITXINTRIN_H_INCLUDED 

但在這種情況下,它甚至有可能使上不同的GPU上運行的單個對象?

這是nvidia-smi輸出:

+-----------------------------------------------------------------------------+ 
| NVIDIA-SMI 384.90     Driver Version: 384.90     | 
|-------------------------------+----------------------+----------------------+ 
| GPU Name  Persistence-M| Bus-Id  Disp.A | Volatile Uncorr. ECC | 
| Fan Temp Perf Pwr:Usage/Cap|   Memory-Usage | GPU-Util Compute M. | 
|===============================+======================+======================| 
| 0 Quadro P4000  Off | 00000000:04:00.0 Off |     N/A | 
| 46% 39C P0 29W/105W |  0MiB/8112MiB |  0%  Default | 
+-------------------------------+----------------------+----------------------+ 
| 1 Quadro K4200  Off | 00000000:84:00.0 Off |     N/A | 
| 30% 40C P0 26W/110W |  0MiB/4036MiB |  0%  Default | 
+-------------------------------+----------------------+----------------------+ 

我應該禁用舊卡,可以在駕駛者看見兩個卡開始行爲不正確?是否有任何內部NVIDIA日誌/工具可用於更詳細地描述失敗的內容?

+3

您是否已經嘗試在'cuda-memcheck'或'cuda-gdb'中運行? –

+1

是的,你應該改變你的構建命令。爲你的設備添加'-gencode = arch = compute61,code = sm_61'。 – tera

+0

@tera,是的,它是固定的,現在舊卡會拋出'cudaErrorNoKernelImageForDevice'。解決在不同體系結構的卡片上運行相同的卡恩問題的一般方法是什麼?從相同的cpp生成多個對象,爲函數名稱加前綴,然後將所有這些綁定在一起? –

回答

2

如何解決...?

通過把你的程序變成

Minimal, Complete, Verifiable Example (MCVE)

這個問題表現的

這會將您的「嫌疑人名單」集中到很少的CUDA API調用中,這應該足以讓您自己找出問題,或者可以讓您發佈整個事件(在不同的問題),並獲得適當的幫助。或者你會發現問題消失了,因爲你放棄了代碼中無關緊要的部分,這意味着它存在於你剛纔刪除的部分。

+0

我的理解非常好,問題在於即使我做了一個較小的例子,相同的代碼對於一個設備工作正常,但另一方面卻失敗了,因此問題的意圖是要了解是否有內部NVIDIA工具I可以使用,因爲'cudaErrorUnknown'沒有太多的工作。這個問題並不是作爲一個「我怎樣才能調試問題」的問題,更多的是「嘿,每天與CUDA一起工作的人,也許你有一些提示」的問題。 –

+0

@RudolfsBundulis:你不能發佈在一個設備上工作並且在另一個設備上失敗的代碼嗎? – einpoklum

+0

建議切換拱已經解決了問題,所以基本上我得到了我想要的:) –

1

重新編譯內核的建議由@tera固定它的Quadro P4000正確的結構標誌-gencode=arch=compute_61,code=sm_61,但是現在同樣的代碼失敗在Quadro K4200,但這次有了合理的錯誤cudaErrorNoKernelImageForDevice

這表示沒有可用的適合該設備的內核映像。當用戶爲不包含相應設備配置的特定CUDA源文件指定代碼生成選項時,可能會發生這種情況。

因此,顯然我最大的問題是缺乏瞭解可能導致cudaErrorUnknown的原因。

+1

您可以在同一個構建命令中使用多個'-gencode'參數,每個想要支持的體系結構都有一個參數。 – tera

+0

@tera - 謝謝,我不知道這:)我已經開始製作一個makefile文件,它可以使多個對象脫離源文件並修改函數名稱。非常感謝你。 –