版本配置的无效配置参数在x64平台上独立执行

时间:2017-09-24 08:04:09

标签: c++ opencv visual-studio-2013 cuda release

我正在使用: GeForce GTX 1080 TI具有6.1的计算能力。 OpenCV 3.2版本(分别针对VS2013,x64发布和调试配置而构建)。 CUDA 8.0版。 Visual Studio 2013,x64平台的Relase和Debug配置。

我的目的是处理整个输入图像的一部分。 图像部分由左上角坐标和宽度和高度声明。

问题描述: 无效配置参数当我通过visual studio DEBUG菜单以独立模式运行Release输出(无需调试)时,CUDA错误仅 Ctrl + F5 )。

如果我通过VS Debug菜单(F5)运行相同的Release可执行文件,则不会引发错误。

此外,当我运行由相同应用程序代码生成的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. 使用默认流而不是特定流

1 个答案:

答案 0 :(得分:1)

找到了问题来源。 由于问题是在我没有调试模式的Release下执行我的应用程序时引发的,我只能使用print命令来了解变量值是什么以及代码的实际流程是什么。

所以,我认为dimGrid.y只在这种执行模式下被错误地设置为负值,并且在所有其他执行模式下,它是正如我预期的那样的正值。 由于这个负值,CUDA被提出了#34;无效的配置参数&#34;。

更多细节: 我有一个代码,根据输入图像分辨率计算所需的dimGrid值,如果它是纵向或横向。 我使用bool类型的类成员来保存此指示并将其初始化值发送到其他子类,作为主类的成员初始化列表调用的一部分,其中包括所有子类作为成员。

据了解,只有在没有调试执行模式的Release中,bool值为false而不是true(表示横向模式)在子类的范围内,与主类范围内的值相反。 / p>

在我将其发送给所有其他子类构造函数之前,我已经验证我已将其初始化(作为成员初始化列表的一部分)为true,但是由于类成员初始化顺序不是根据以下事实确定的成员初始化列表顺序,但根据它在类中的声明顺序,它是一个未经授权的发送给他们。

在我的系统中,只有在没有调试执行模式的Release中,一个没有启动的bool类型获得0值,但在所有其他执行模式中它获得一个正值。

而&#34;如果&#34;条件是在未初始化的bool类型上执行的,0转换为false但任何正值都转换为true。

这是因为dimGrid值计算错误。