我正在使用: 具有計算能力的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);
}
錯誤也提升時:
- 內核完全是空的(所有行了評論)
- 內核輸入列表是空的。
- 使用默認流代替特定流
你在編譯什麼架構?您的GPU是一個計算能力6.1設備,而不是3.0。 CUDA 8工具包將默認計算2.0。這可能解釋發射失敗。 – talonmies
感謝您的快速響應。 你是對的CC,這是一個錯字。 關於您關於體系結構的問題: 如果我正確理解您,我正在使用發佈配置和x64平臺。如果不是,請澄清。 你能指導我嗎?我該如何更改CUDA 8.0工具包的CC? – OronG
如果這是一個錯字,那麼[編輯]問題並修復它。 –