我有一個很大的代碼庫,可以通過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日誌/工具可用於更詳細地描述失敗的內容?
您是否已經嘗試在'cuda-memcheck'或'cuda-gdb'中運行? –
是的,你應該改變你的構建命令。爲你的設備添加'-gencode = arch = compute61,code = sm_61'。 – tera
@tera,是的,它是固定的,現在舊卡會拋出'cudaErrorNoKernelImageForDevice'。解決在不同體系結構的卡片上運行相同的卡恩問題的一般方法是什麼?從相同的cpp生成多個對象,爲函數名稱加前綴,然後將所有這些綁定在一起? –