CUDA C ++从主机读取映像并将其复制到设备

问题描述

我需要读取图像并将其存储到无符号char数组中,并使用该数组构造一个类。类的构造是设备功能。所以我需要阅读图像并复制到设备。代码类似于下面的代码

    __global__ void print_copy_result(unsigned char **tdt)
{
    if (threadIdx.x == 0 && blockIdx.x == 0) 
    {
        printf("%c\t%c\t%c\t",(*tdt)[0],(*tdt)[1],(*tdt)[2]);
    }
}

int main()
{
    int inx,iny,inn;
    unsigned char* texture_data = stbi_load("60847663_p0.jpg",&inx,&iny,&inn,0);
    printf("%hhc,%hhc,%hhc\n",texture_data[0],texture_data[1],texture_data[2]);

    unsigned char* d_texture_data;

    checkCudaErrors(cudamallocManaged(&d_texture_data,inx * iny * inn * sizeof(unsigned char)));
    checkCudaErrors(cudamemcpy(d_texture_data,texture_data,inx * iny * inn * sizeof(unsigned char),cudamemcpyDefault));
    print_copy_result<<<1,1>>>(&d_texture_data);
    checkCudaErrors(cudaGetLastError());
    checkCudaErrors(cudaDeviceSynchronize());
    return 0;
}

但是我在checkCudaErrors(cudaDeviceSynchronize());遇到CUDA错误= 700,这是我做错了哪一步?

解决方法

如注释中所示,<script src="https://jeremyckahn.github.io/keydrown/dist/keydrown.min.js"></script>是指向主机内存(不是托管内存,而是主机内存)的指针。此类指向主机内存的指针基本上无法被CUDA设备代码使用(CUDA内核代码无法取消引用此类主机内存指针,除非在Power9平台上某些情况下除外)。

无论如何,您都不需要这种间接级别。最直接的方法是使用类似于here所示的方法,然后将“普通”托管指针传递给内核。由于我们不再使用双指针方法,因此内核也需要更改:

&d_texture_data