gpt4 book ai didi

c++ - PtrStepSz(GpuMat) 数组到 C CUDA 内核

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

我正在尝试使用 CUDA 内核中的 GpuMat 数组的信息修改 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);
//...
}

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

关于c++ - PtrStepSz(GpuMat) 数组到 C CUDA 内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31927297/

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