Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.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++ CUDA C++;从主机读取图像并复制到设备_C++_Cuda - Fatal编程技术网

C++ CUDA C++;从主机读取图像并复制到设备

C++ CUDA C++;从主机读取图像并复制到设备,c++,cuda,C++,Cuda,我需要读取一个图像并将其存储到一个无符号字符数组中,然后使用该数组构造一个类。类结构是设备函数。所以我需要读取图像并复制到设备。代码如下所示 __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)

我需要读取一个图像并将其存储到一个无符号字符数组中,然后使用该数组构造一个类。类结构是设备函数。所以我需要读取图像并复制到设备。代码如下所示

    __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;
}
\uuuuu全局\uuuuuu无效打印\u复制\u结果(无符号字符**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;
无符号字符*texture_data=stbi_加载(“60847663_p0.jpg,&inx,&iny,&inn,0);
printf(“%hhc,%hhc,%hhc\n”,纹理数据[0],纹理数据[1],纹理数据[2]);
无符号字符*d_纹理数据;
检查CUDAERRORS(cudaMallocManaged(&d_纹理_数据,inx*iny*inn*sizeof(无符号字符));
检查CUDAERRORS(cudaMemcpy(d_纹理_数据,纹理_数据,inx*iny*inn*sizeof(无符号字符),cudaMemcpyDefault));
打印\u复制\u结果(&d\u纹理\u数据);
检查CUDAErrors(cudaGetLastError());
检查CUDAErrors(cudaDeviceSynchronize());
返回0;
}

但是我在
checkCudaErrors(cudaDeviceSynchronize())中得到了CUDA error=700我错了哪一步?

如注释中所示,
&d\u纹理\u数据
是指向主机内存(不是托管内存,而是主机内存)的指针。CUDA设备代码基本上无法使用这样一个指向主机内存的指针(CUDA内核代码不能取消引用这样的主机内存指针,Power9平台上的某些情况除外)

无论如何,你不需要那种程度的间接。最直接的方法是使用类似于所示的方法,只需将“普通”托管指针传递到内核。由于我们正在摆脱双指针方法,因此还需要对内核进行一些更改:

$ cat t54.cu
#include <cstdio>
#include <helper_cuda.h>

    __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;
    const unsigned char texture_data[] = {'a', 'b', 'c'};
    printf("%hhc, %hhc, %hhc\n", texture_data[0], texture_data[1], texture_data[2]);
    inx = sizeof(texture_data)/sizeof(texture_data[0]);
    iny = 1;
    inn = 1;
    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());
    printf("\n");
    return 0;
}
$ nvcc -o t54 t54.cu -arch=sm_35 -I/usr/local/cuda/samples/common/inc  -Wno-deprecated-gpu-targets
$ cuda-memcheck ./t54
========= CUDA-MEMCHECK
a, b, c
a       b       c
========= ERROR SUMMARY: 0 errors
$
$cat t54.cu
#包括
#包括
__全局\无效打印\复制\结果(无符号字符*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;
常量无符号字符纹理_数据[]={'a','b','c'};
printf(“%hhc,%hhc,%hhc\n”,纹理数据[0],纹理数据[1],纹理数据[2]);
inx=sizeof(纹理数据)/sizeof(纹理数据[0]);
iny=1;
inn=1;
无符号字符*d_纹理数据;
检查CUDAERRORS(cudaMallocManaged(&d_纹理_数据,inx*iny*inn*sizeof(无符号字符));
检查CUDAERRORS(cudaMemcpy(d_纹理_数据,纹理_数据,inx*iny*inn*sizeof(无符号字符),cudaMemcpyDefault));
打印复制结果(纹理数据);
检查CUDAErrors(cudaGetLastError());
检查CUDAErrors(cudaDeviceSynchronize());
printf(“\n”);
返回0;
}
$nvcc-o t54 t54.cu-arch=sm_35-I/usr/local/cuda/samples/common/inc-Wno不推荐的gpu目标
$cuda memcheck./t54
==========CUDA-MEMCHECK
a、 b,c
a、b、c
======错误摘要:0个错误
$

&d_纹理_数据
在主机内存中,这是您弄错的。非常感谢