2017-09-24 4 views
0

私は以下を使用しています: GeForce GTX 1080計算能力を持つTI 6.1。 OpenCV 3.2バージョン(VS2013、x64リリース用にビルドされ、デバッグ構成は別途) CUDA 8.0バージョン。 ビジュアルスタジオ2013、x64プラットフォームの設定を解除してデバッグします。x64プラットフォームでスタンドアロンでリリース設定をリリースするための設定引数が無効です

私の目的は、入力画像全体の一部を処理することです。 画像部分は、左上の座標と幅と高さで宣言されています。

問題の説明: 無効な設定引数 CUDAエラーがrasiedさのみ私は、Visual Studioの[デバッグ]メニュー(はCtrl + F5)を経由して(デバッグなし)スタンドアローンモードでのリリース出力を実行しているとき。

VSデバッグメニュー(F5)で同じリリースの実行ファイルを実行している場合、エラーは発生しません。

同じアプリケーションコードによって生成されたデバッグ構成の出力を実行しているときは、オプション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は3.0ではなく、コンピューティング機能6.1のデバイスです。 CUDA 8ツールキットはデフォルトで計算2.0になります。それは打ち上げ失敗を説明するかもしれない。 – talonmies

+0

あなたの迅速な対応に感謝します。 あなたはCCについて正しいです、それはタイプミスでした。 アーキテクチャに関するご質問について: 私が正しく理解している場合は、リリース構成とx64プラットフォームを使用しています。そうでない場合は、明確にしてください。 CUDA 8.0ツールキットのCCをどのように変更することができますか教えてください。 – OronG

+1

もしそれがタイプミスならば、質問を編集して修正してください。 –

答えて

0

特定のストリームのために使用されます。 デバッグモードなしでReleaseでアプリケーションを実行したときにのみ問題が発生したため、変数の値とコードの実際の流れを確認するためにprintコマンドを使用しました。

したがって、dimGrid.yが間違ってこの実行モードでのみ負の値に設定され、他のすべての実行モードでは期待通りの正の値だったと考えました。 この負の値のために、CUDAは "無効な構成引数"のエラーを発生させました。

その他の詳細: 入力画像の解像度に基づいて必要なdimGrid値を計算するコードがあり、それがポートレートまたはランドスケープの場合はコードがあります。 私はbool型のクラスメンバーを使用してこの指示を保持し、その初期値を他のサブクラスにメンバーとして初期化リストの呼び出しとして送信します。

デバッグ実行モードなしのリリースでは、メインクラスのスコープ内の値とは反対のサブクラスのスコープ内で、bool値がtrue(ランドスケープモードを表す)ではなくfalseだったことがわかりました。

他のすべてのサブクラスのコンストラクタに送信する前に(メンバー初期化リストの一部として)初期化されていることが確認されましたが、クラスメンバの初期化順序は、メンバーの初期化リストの順序ではなく、そのクラスの宣言の順序に応じて、それらは初期化されていません。

私のシステムでは、実行モードをデバッグせずにリリースしただけで、初期化されていないブール型は0の値を取得しますが、他のすべてのモードでは正の値を取得します。

初期化されていないブール型で "if"条件が実行されている間、0はfalseに変換されますが、正の値はすべてtrueに変換されます。

これは、dimGrid値の計算が正しく行われなかったためです。

関連する問題