PtrStepSz(GpuMat)到C CUDA内核的数组

时间:2015-08-10 19:11:15

标签: c++ opencv cuda gpu

我正在尝试使用CUDA内核中的GpuMats数组来修改GpuMat。
要修改它,我发送GpuMat并将其转换为内核中的PtrStepSz,如:

__global__ void func(cuda::PtrStepSz<float> X)
{//...
}
int main()
{//...
    GpuMat X;
    func<<<blocks, threads>>>(X);
}

哪个工作正常......现在我正在尝试使用PtrStepSz数组的信息......我一直在尝试这样的事情:

__global__ void func2(cuda::PtrStepSz<float> arr[])
{//...
}
int main()
{
    cuda::PtrStepSz<float> *d_arr;
    cudaMalloc((void**)&d_arr, sizeof(cuda::PtrStepSz<float>)*N );
    cuda::GpuMat mats[N];
    Mat O = Mat::ones(size, size, CV_32FC1);
    for (int i = 0; i < N; i++){
      mats[i].upload(O);
      d_arr[i] = mats[i];
    }
    func2<<<blocks, threads>>>(d_arr);
    //...
}

哪个不起作用......甚至没有初始化部分(我猜是因为我无法从CPU修改GPU内容)...有关如何完成我需要的任何想法?谢谢你的帮助

1 个答案:

答案 0 :(得分:4)

如果它可以帮助别人...
我设法通过制作一个PtrStepSz的CPU数组,用GpuMats初始化它,然后创建一个指向PtrStepSz的指针来解决它,我分配并复制GPU上数组的内容。 结果是这样的:

__global__ void func2(cuda::PtrStepSz<float> arr[])
{//...
}
int main()
{
    cuda::PtrStepSz<float> *sender;
    cuda::PtrStepSz<float> d_arr[N];
    cuda::GpuMat mats[N];
    Mat O = Mat::ones(size, size, CV_32FC1);
    for (int i = 0; i < N; i++){
      mats[i].upload(O);
      d_arr[i] = mats[i];
    }
    cudaMalloc((void**)&sender, sizeof(cuda::PtrStepSz<float>)*N );
    cudaMemcpy(sender, d_arr, sizeof(cuda::PtrStepSz<float>) * N,
      cudaMemcpyHostToDevice);
    func2<<<blocks, threads>>>(sender);
    //...
}

无论如何,我很高兴看到是否有人有更好的主意:)