2017-10-19 209 views
0

我一直在成功使用GPU支持OpenCV一段時間,但是,我遇到了一個我似乎無法修復的情況。在用VS 2013和CUDA 8.0構建OpenCV 3.3之後,OpenCV cpu和gpu似乎可以在我的幾臺測試機器GTX 750 Ti和GTX 950M(都使用Windows 10)上正常工作。在另一臺裝有GTX 1050 Ti的機器上,CPU調用工作正常,但是在我的第一個OpenCV-cuda函數調用中出現「無效的設備函數」。在CMake中,我調整了CUDA_ARCH_BIN和CUDA_GENERATION變量並進行了重建,但似乎無法爲這臺機器找到解決方案。我已經更新了NVidia圖形驅動程序,嘗試CUDA_ARCH_BIN在3.0,3.5,3.7,5.0和開普勒,麥克斯韋的CUDA_GENERATION,並且是空的。所有工作都在兩臺測試機器上,並且在第三臺機器上出現同樣的錯誤。我在網上發現的一切都表明,這是由於GPU的計算能力與CUDA_ARCH_BIN設置不匹配造成的。我認爲如果我爲5.0/Maxwell設置,它將在Maxwell,Pascals和更新的版本上運行。唯一的其他變量是1050 Ti在Windows 7機器上運行,我祈禱這不是問題。或者,VS2013,Cuda 8.0和/或OpenCV 3.3之間可能存在不兼容問題?任何想法將不勝感激。OpenCV Cuda「無效的設備功能」第一次撥打電話

+2

我建議增加拱6.1 /帕斯卡爾,因爲我在寫這個問題,這是發生在我的帕斯卡爾1050設備 –

+0

@RobertCrovella可能是問題。我認爲將CUDA_ARCH_BIN設置爲3.0,3.2,3.5,3.7,5.0,5.2可以在6.1卡上工作。我想可能*你想覆蓋的每一個*計算能力必須在列表中?無論如何...現在建設,並會報告回來。 –

+2

這取決於cmake如何將這些條目轉換爲實際的CUDA構建開關。如果它指定包含PTX,那麼您是正確的。如果沒有,我是正確的。由於「無效設備功能」錯誤是一個非常明確的跡象,表明在構建的圖像中不存在合適的PTX,我傾向於相信我是正確的,並與您自己的聲明一致:「我在網上找到的所有內容這是由GPU的計算能力與CUDA_ARCH_BIN設置之間的不匹配造成的「 –

回答

1

感謝@RobertCrovella提供正確的答案。只需在CMAKE的CUDA_ARCH_BIN列表中添加6.1即可解決問題。所以我最終使用的是 CUDA_ARCH_BIN = 5.0,5.2,6.0,6.1(因爲我只對Maxwell和Pascal感興趣) ,我離開CUDA_GENERATION爲空。如果你爲CUDA_GENERATION選擇了一些東西,它會自動爲你填充CUDA_ARCH_BIN ...對我來說,它給了我比我想要的更多的東西。

備註:我注意到,您添加到CUDA_ARCH_BIN的架構越多,OpenCV dll變得越大。這正好支持羅伯特在評論中所說的話。看起來,對於列表中的每個體系結構,該體系結構的特定代碼都會添加到dll中。如果您沒有在列表中放置拱門,代碼將無法在該拱門上運行。

現在一切似乎都很明顯。

再次感謝羅伯特!

對於那些有興趣,這裏是我的cmake CUDA設置:

enter image description here