Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ x64平台上独立执行版本配置的配置参数无效_C++_Opencv_Visual Studio 2013_Cuda_Release - Fatal编程技术网

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

C++ x64平台上独立执行版本配置的配置参数无效,c++,opencv,visual-studio-2013,cuda,release,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平台的配置 我的目的是处理整个输入图像的一部分。 由左上角坐标以及宽度和高度声明的图像部分 问题描述: 只有在未通过visual studio调试菜单Ctrl+F5进行调试的情况下以独立模式运行版本输出时,才会显示无效的配置参数CUDA错误 如果我通过VS Debug菜单

我正在使用: GeForce GTX 1080 TI,其计算能力为6.1。 OpenCV 3.2版本分别针对VS2013、x64版本和调试配置构建。 CUDA 8.0版本。 Visual studio 2013,放松和调试x64平台的配置

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

问题描述: 只有在未通过visual studio调试菜单Ctrl+F5进行调试的情况下以独立模式运行版本输出时,才会显示无效的配置参数CUDA错误

如果我通过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);
}
在以下情况下也会引发错误:

内核完全为空,所有行都已注释 内核输入列表为空。 使用默认流而不是特定流
找到了问题源。 由于这个问题是在没有调试模式的发布模式下执行应用程序时才出现的,因此我只能使用prints命令来了解变量值和代码的实际流程

所以,我认为只有在这个执行模式下,dimGrid.y被错误地设置为负值,而在所有其他执行模式下,正如我所期望的那样,它是正值。 由于此负值,CUDA引发了无效配置参数的错误

更多详情: 我有一个代码,可以根据输入的图像分辨率计算所需的dimGrid值,以及它是纵向还是横向。 我使用类型bool中的一个类成员来保存这个指示,并将其初始化值发送给其他子类,作为主类的成员初始化列表调用的一部分,该调用将所有子类都包含为一个成员

我们发现,只有在不调试执行模式的发布中,bool值才是false,而不是true,它表示子类范围内的横向模式,与主类范围内的值相反

在我将其发送给所有其他子类构造函数之前,我验证了它作为成员初始化列表的一部分被初始化为true,但由于类成员初始化顺序不是根据成员初始化列表顺序确定的,而是根据其发送到的类中的声明顺序确定的他们是个外行

在我的系统中,只有在Release With debugging执行模式下,未初始化的bool类型得到0值,但在所有其他执行模式下,它得到正值

如果对未初始化的布尔类型执行条件,则0将转换为false,但任何正值将转换为true


这是由于dimGrid值计算错误造成的。

您编译的是什么体系结构?您的GPU是计算能力为6.1的设备,而不是3.0。CUDA 8工具包将默认为compute 2.0。这也许可以解释发射失败的原因。谢谢你的快速反应。关于抄送,你是对的,它是一个打字错误。关于您关于体系结构的问题:如果我理解正确,我使用的是版本配置和x64平台。如果没有,请澄清。您能告诉我如何更改CUDA 8.0工具包的CC吗?如果是打字错误,请回答问题并修复它。没问题,我修复了它。我通过Visual Studio菜单将CUDA计算功能更改为:项目->属性->CUDA C/C++->>设备->代码生成:compute_61,sm_61。问题仍然存在。附加信息:当我更改以下内容时,问题消失:ResSliceParams.m_StartRow=0;ResSliceParams.m_StartCol=0;ResSliceParams.m_SizeRows=7096;ResSliceParams.m_SizeCols=10000;请告知。