发行配置的无效配置参数在X64平台上独立执行

Invalid configuration argument for Release configuration stand alone execution on x64 platform

本文关键字:配置 平台 独立 X64 执行 参数 无效      更新时间:2023-10-16

我正在使用:GeForce GTX 1080 Ti具有计算能力6.1。OPENCV 3.2版本(分别为VS2013,X64发布和调试配置构建)。CUDA 8.0版本。Visual Studio 2013,X64平台的重新和调试配置。

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

问题描述:无效的配置参数 CUDA错误是rasied 唯一的当我通过Visual Studio Debug debug菜单( ctrl )以独立模式(无调试)运行发行版输出时f5 )。

如果我通过VS DEBUG菜单(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. 使用默认流代替特定流

找到了问题源。由于仅当我在没有调试模式的情况下发布我的申请时才提出问题,因此我只能使用prints命令来了解什么是变量值以及代码的真实流量是什么。

因此,我被认为dimgrid.y仅在此执行模式下被错误地设置为负值,并且在所有其他执行模式下,这是我预期的正值。由于这个负值,CUDA被提高为"无效配置参数"的rroR。

更多细节:我有一个代码,该代码根据输入图像分辨率以及它是肖像或景观来计算所需的DIMGRID值。我正在使用类型Bool的类成员保存此指示,并将其初始化值发送到其他子类,这是主类的成员初始化列表的一部分,这些列表将所有这些都包括在内。

可以弄清楚,只有在没有调试执行模式的情况下发布时,布尔值是错误的,而不是true(代表景观模式),在子类的范围中与其在主类范围中的值相反。<<<<<<<<<<<<<<<<<</p>

我经过证实,在将其发送给所有其他子类构造函数之前,我已将其初始化(作为成员初始化列表的一部分),但是由于类成员初始化顺序未根据成员确定初始化列表订单,但根据班级中的声明命令,将其发送给他们一个未经启发的人。

在我的系统中,只有在没有调试执行模式的情况下发布时,一个未经启动的bool类型获得0值,但在所有其他出口模式下,它都会获得正值。

在" if"条件下进行了" if"条件,在未经启动的布尔类型上执行,0转化为false,但任何正值都会转化为true。

这是由于对Dimgrid值的错误计算而引起的。