gpt4 book ai didi

c++ - 调用cudaMemcpy2DToArray时访问违规读取位置

转载 作者:太空宇宙 更新时间:2023-11-03 22:00:41 24 4
gpt4 key购买 nike

我在设备中分配了一个二维数组,想将一个二维 float 组复制到设备中。ImgSrc 是 openCV 中的一个 Mat 类型,我将它的元素复制到一个名为 ImgSrc_f 的二维 float 组中。然后通过使用 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);

但我得到了这个异常(exception):

Access violation reading location 0x0000000000281000

最佳答案

ImgSrc_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;
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);
}

cudaMemcpy2DToArray expects指向单个连续内存块的源指针。

关于c++ - 调用cudaMemcpy2DToArray时访问违规读取位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30692332/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com