2017-09-24 53 views
0

我正在使用: 具有計算能力的GeForce GTX 1080 TI 6.1。 OpenCV 3.2版本(專爲VS2013,x64版本和調試配置分別構建)。 CUDA 8.0版本。 x64平臺的Visual Studio 2013,Relase和Debug配置。發佈配置在x64平臺上獨立執行的配置參數無效

我的目的是處理整個輸入圖像的一部分。 由左上角座標和寬度和高度聲明的圖像部分。

問題描述: 的無效的配置參數 CUDA錯誤rasied 當我通過Visual Studio的調試菜單(Ctrl + F5鍵)運行在單機模式下的釋放輸出(不調試)。

如果我通過VS調試菜單(F5)運行相同的發佈可執行文件,則不會引發錯誤。

另外,當我運行由同一應用程序代碼生成的Debug配置的輸出時,F5和Ctrl + F5都可以正常工作,並且不會引發錯誤。

這裏是我的代碼:

struct sRect 
{ 
unsigned int m_StartRow; 
unsigned int m_StartCol; 
unsigned int m_SizeRows; 
unsigned int m_SizeCols; 
}; 
__global__ void CleanNoisePreparation(unsigned char * SrcImage, size_t  iStep, const sRect ImageSlice) 
{ 
int iXPos = threadIdx.x + blockIdx.x*blockDim.x; 
int iYPos = threadIdx.y + blockIdx.y*blockDim.y; 

if (!(iXPos < ImageSlice.m_SizeCols && iYPos < ImageSlice.m_SizeRows)) 
    return; 

/*In case pixel value is less or equal to 127 set it to black color (0) otherwisw set it to white color (255)*/ 
SrcImage[iYPos * iStep + iXPos] = (SrcImage[iYPos * iStep + iXPos] <= (unsigned char)127) ? ((unsigned char)0) : ((unsigned char)255); 
} 
void PerformCleanNoisePreparationOnGPU(cv::cuda::GpuMat& Image, 
            const sRect &ImageSlice, 
            const dim3 &dimGrid, 
            const dim3 &dimBlock, 
            const cudaStream_t &Stream) 
{ 
     /*Calculate the rquired start address based on the required image slice characteristics*/ 

unsigned char * pImageData = (unsigned char*)(Image.data ImageSlice.m_StartRow * Image.step + ImageSlice.m_StartCol); 

CleanNoisePreparation << <dimGrid, dimBlock, 0, Stream >> >(pImageData, Image.step, ImageSlice); 
CUDA(cudaGetLastError()); 
} 

void main 
{ 
    sRect ResSliceParams;   

    ResSliceParams.m_StartRow = 0; 
ResSliceParams.m_StartCol = 4854; 
ResSliceParams.m_SizeRows = 7096; 
ResSliceParams.m_SizeCols = 5146; 
    cv::cuda::GpuMat MyFrame = cv::cuda::GpuMat::GpuMat(cv::Size(10000, 7096), CV_8U); 
    //Image step size is 10240 

    dim3 dimBlock (32, 32, 1) 
    dim3 dimGrid (161, 222, 1) 

    cudaStream_t cudaStream; 

    cudaStreamCreateWithFlags(&cudaStream, cudaStreamNonBlocking); 

    PerformCleanNoisePreparationOnGPU(MyFrame, 
              ResSliceParams, 
              dimGrid, 
              dimBlock, 
              cudaStream); 
} 

錯誤也提升時:

  1. 內核完全是空的(所有行了評論)
  2. 內核輸入列表是空的。
  3. 使用默認流代替特定流
+0

你在編譯什麼架構?您的GPU是一個計算能力6.1設備,而不是3.0。 CUDA 8工具包將默認計算2.0。這可能解釋發射失敗。 – talonmies

+0

感謝您的快速響應。 你是對的CC,這是一個錯字。 關於您關於體系結構的問題: 如果我正確理解您,我正在使用發佈配置和x64平臺。如果不是,請澄清。 你能指導我嗎?我該如何更改CUDA 8.0工具包的CC? – OronG

+1

如果這是一個錯字,那麼[編輯]問題並修復它。 –

回答

0

發現問題來源。 由於只有當我在無調試模式的Release下執行我的應用程序時,纔會引發問題,所以我只能使用打印命令來了解變量值以及代碼的實際流程。

所以,我認爲dimGrid.y被錯誤地設置爲一個負值,只有在這個執行模式下,在所有其他執行模式下,它纔是正值,正如我所預料的那樣。由於這個負值,CUDA引發了「無效配置參數」的錯誤。

更多詳細信息: 我有一個代碼,它根據輸入圖像分辨率以及它是否爲人像或風景來計算所需的dimGrid值。 我使用類型爲bool的類成員來保存該指示,並將其初始化值發送給其他子類,作爲主類的成員初始化列表調用的一部分,其中包括它們作爲成員的所有成員。

有人發現只有在沒有調試執行模式的Release中,bool值是false,而不是true(它代表橫向模式)在子類的範圍內,與其在主類範圍內的值相反。

我得到證實,它在我將它發送給所有其他子類構造函數之前被初始化爲真(作爲成員初始化列表的一部分)爲true,但由於類成員初始化順序未根據成員初始化列表順序,但根據他們的聲明順序,它被髮送給他們一個不熟悉的。

在我的系統中,只有在沒有調試執行模式的發佈版本中,未啓動的布爾類型獲取0值,但在所有其他執行模式下,它會得到一個正值。

雖然對未初始化的布爾類型執行「if」條件,但將0轉換爲false,但將任何正值轉換爲true。

這是由於dimGrid值的計算錯誤造成的。