2015-01-06 37 views
2

我一直在我的程序中使用OpenCV的GPU模塊(cuda),它工作正常。現在我將我的顯卡升級爲gtx970。現在,我啓動程序後第一次調用cv :: gpu :: GpuMat :: upload,我得到了很長的延遲。用我的舊顯卡(GTX770)幾乎可以立即完成。C++:cv :: gpu上的長延遲::升級到GTX970後的GpuMat :: upload

示例:我有一個尺寸爲512x600像素的圖像。有了這張圖片,它需要12秒。如果我之後再次執行相同的代碼而沒有關閉程序,它會立即執行。我知道,在啓動程序後第一次執行CUDA代碼時,它會在GPU上編譯,因此一定的延遲是正常的。但對我來說,這似乎是莫名其妙的長時間,尤其是因爲舊卡的速度更快。

有誰知道什麼會導致這種行爲?目前的OpenCV版本有沒有與GTX970卡有關的已知問題?我使用的版本是2.4.10,除3.0beta之外,最新版本。

我現在也發現有特別支持GTX970和GTX980顯卡的CUDA工具包的發佈:

https://developer.nvidia.com/cuda-dow ...

我下載它,並與一個重新編譯的OpenCV。不幸的是,這並沒有解決我的問題。不知何故,我已經感覺它現在需要更長時間了。

這裏有誰有任何GTX900卡和OpenCV的經驗嗎?

這是代碼,如果任何人希望看到它:

if (_cudaAvailable){ 
     try{ 
      _gpuUploadMutex.lock(); 
      //upload image channels to the gpu if using cuda 
      cv::gpu::GpuMat gpuMat; 
      gpuMat.upload(_originalImage); 
      cv::gpu::split(gpuMat, _originalImageChannelsCuda); 
      _gpuUploadMutex.unlock(); 
      std::cout << "Image uploaded to GPU successfully" << std::endl; 
     } 
     catch (...){ 
      std::cerr << "Error occured while using CUDA, falling back to CPU. (Insufficient video RAM?)" << std::endl; 
      _cudaAvailable = false; 
      _gpuUploadMutex.unlock(); 
     } 
    } 

沒什麼特別的。引起初始延遲的代碼行是gpuMat.upload。

+0

你自己編譯的OpenCV獲得CUDA庫支持?你重新編譯openCV嗎?兩個顯卡是否都支持不同的架構? – Micka

+0

如果您上傳第二張圖片(不是同一張圖片)是否還有其他延遲? – Micka

+3

這聽起來像是你正在碰撞JIT編譯延遲。即使是新的工具包也不會修復它,如果你不用必要的開關('-arch = sm_52')重新編譯你的閃亮的新麥克斯韋。 –

回答

3

當您的程序嘗試在GPU上執行代碼時,驅動程序將檢查可執行文件以找到適合您的特定GPU上運行的代碼。該可執行文件被稱爲「胖二進制文件」,這意味着它可以包含多種體系結構的代碼。

在GPU的情況下,可執行文件可以包含針對不同GPU和PTX的機器代碼,PTX是稍微更高級的語言(看起來像彙編),可以在運行時編譯到特定的GPU。

在你的情況下,我猜想二進制包含原始GPU(GTX770是計算能力3.0)的機器代碼,但不是新的GPU(GTX970是計算能力5.2)。因此,當您在新GPU上運行時,驅動程序會找到PTX(也包含在fat二進制文件中)並將其重新編譯爲sm5.2。這次重新編譯正在花時間。

如果你能找到你的編譯命令,你會看到這樣的內容:

nvcc ... -gencode arch=compute_30,code=\'compute_30,sm_30\' 

,你應該更改爲:

nvcc ... -gencode arch=compute_30,code=\'compute_30,sm_30,sm_52\' 
+0

好的,謝謝你提供的這些信息!我有一個使用cmake生成的OpenCV視覺工作室項目。不幸的是,我不知道cuda編譯器實際調用的位置以及我應該添加此標誌的位置。我承認並不是真正的專家。 – user1488118

+0

這是這個項目的樣子:http://i.imgur.com/TWdfd4y.png我猜,這些編譯器選項對於Visual Studio編譯器來說是這樣的。 – user1488118

+0

我認爲你必須爲該新架構編譯openCV,但這只是一個猜測。 – Micka