我正在尝试使用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内容)...关于如何完成我需要的任何想法?谢谢你的帮助
最佳答案
万一它可以帮助别人...
我设法通过制作一个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);
//...
}
无论如何,我很高兴看到是否有人有更好的主意:)