Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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++ 调用cudaMemcpy2DToArray时访问违反读取位置_C++_Arrays_Opencv_Cuda - Fatal编程技术网

C++ 调用cudaMemcpy2DToArray时访问违反读取位置

C++ 调用cudaMemcpy2DToArray时访问违反读取位置,c++,arrays,opencv,cuda,C++,Arrays,Opencv,Cuda,我在设备中分配了一个2D数组,并希望将2D浮点数组复制到设备。 ImgSrc是openCV中的一种Mat类型,我将它的元素复制到一个名为ImgSrc_f的二维浮点数组中。然后使用cudaMemcpy2DToArray()将我的主机二维数组(ImgSrc_f)复制到设备二维数组Src。 二维阵列的大小为512X512 cudaChannelFormatDesc floattex = cudaCreateChannelDesc<float>(); cudaArray *Src; cuda

我在设备中分配了一个2D数组,并希望将2D浮点数组复制到设备。 ImgSrc是openCV中的一种Mat类型,我将它的元素复制到一个名为ImgSrc_f的二维浮点数组中。然后使用cudaMemcpy2DToArray()将我的主机二维数组(ImgSrc_f)复制到设备二维数组Src。 二维阵列的大小为512X512

cudaChannelFormatDesc floattex = cudaCreateChannelDesc<float>();
cudaArray *Src;
cudaMallocArray(&Src, &floattex, 512, 512);

float *ImgSrc_f[512];
for (int i=0; i<512; i++)
         ImgSrc_f[i] = (float *)malloc(512 * sizeof(float));
for(int i=0;i<512;i++)
    for(int j=0;j<512;j++)
    {
        ImgSrc_f[i][j]=ImgSrc.at<float>(i,j);
    }
//copy from host memory to device
cudaMemcpy2DToArray(Src, 0, 0,ImgSrc_f,512 * sizeof(float),512 *sizeof(float), 512,cudaMemcpyHostToDevice);

ImgSrc\u f
不指向连续的512x512内存块。试着改变

float *ImgSrc_f[512];
for (int i=0; i<512; i++)
         ImgSrc_f[i] = (float *)malloc(512 * sizeof(float));
for(int i=0;i<512;i++)
    for(int j=0;j<512;j++)
    {
        ImgSrc_f[i][j]=ImgSrc.at<float>(i,j);
    }
float*ImgSrc_f[512];

for(int i=0;i
ImgSrc\u f
未指向连续的512x512内存块。请尝试更改

float *ImgSrc_f[512];
for (int i=0; i<512; i++)
         ImgSrc_f[i] = (float *)malloc(512 * sizeof(float));
for(int i=0;i<512;i++)
    for(int j=0;j<512;j++)
    {
        ImgSrc_f[i][j]=ImgSrc.at<float>(i,j);
    }
float*ImgSrc_f[512];

对于(int i=0;我感谢你的帮助。我还有一个问题。你认为这是一种将Mat变量复制到二维浮点数组的优化方法吗?因为我的代码中的速度很重要,正因为如此,我问了这个问题。不是。但这取决于
Mat
是什么。但是,发布一个新问题,并附上所有相关信息和“我相信有人会给你指出正确的方向。谢谢你的帮助。我还有一个问题。你认为这样将Mat变量复制到2D浮点数组是一种优化的方法吗?因为我的代码中的速度很重要,正因为如此,我问了这个问题。不是。但这取决于
Mat
是什么。但是,发布一个新的qu我相信有人会给你指出正确的方向。为什么要构建中间主机阵列呢?如果不能直接从源映像复制到设备阵列,我会非常惊讶。即使你需要在绑定到文本之前对数据进行某种转换嗯,我猜它在GPU上会更快,仅仅是因为它有更高的内存bandwdith@talonmies据我们所知,
Mat
是一个稀疏矩阵,它的数据不会作为连续内存块。问题中没有指定它,尽管我假设事实并非如此。@AviGinsburg:嗯?问题是e输入是一个密集矩阵,存储在倾斜线性矩阵中memory@talonmies哎呀,我看错了第一行。我的错。为什么要构建中间主机阵列呢?如果不能直接从源映像复制到设备阵列,我会非常惊讶。即使你需要对dat进行某种转换a在绑定到纹理之前,我想它在GPU上的速度会更快,这仅仅是因为它有更高的内存bandwdith@talonmies据我们所知,
Mat
是一个稀疏矩阵,它的数据不会作为连续内存块。问题中没有指定它,尽管我假设事实并非如此。@AviGinsburg:Eh?问题是输入是一个密集矩阵,存储在倾斜的线性矩阵中memory@talonmies哎呀,我看错了第一行。我的错。
float *ImgSrc_f;
ImgSrc_f = (float *)malloc(512 * 512 * sizeof(float));
for(int i=0;i<512;i++)
    for(int j=0;j<512;j++)
    {
        ImgSrc_f[i * 512 + j]=ImgSrc.at<float>(i,j);
    }