【发布时间】:2015-03-16 23:37:43
【问题描述】:
TL;DR
我正在寻找一种方法来提取现有 CUDA 工具包示例的一部分并将其转换为 MATLAB 中的 CUDAKernel 可执行文件。
故事
为了获得非局部均值 (NLM) 2D 过滤器的短运行时实现,我偶然发现了 imageDenoising example provided with the CUDA Toolkit,它实现了该过滤器的两个变体,称为 NLM 和 NLM2(或“快速 NLM” )。
之前没有 CUDA 编码经验,我最初尝试关注 MATLAB's documentation on the subject,结果导致了几个奇怪的错误,包括:ptx compilation、multiple entry points 和 wrong number of inputs in the C prototype。在这一点上,我意识到这不会是一个“正常工作”的案例,需要进行一些修补。
所以我决定通过简单地删除imageDenoising.cu文件的一部分并将相关的.cuh(..._nlm_kernel.cuh或..._nlm2_kernel.cuh)合并到.cu中来消除多入口点问题,以便获得单个在任何给定时间的入口点。
令我惊讶的是,这实际上成功地编译了,我终于能够创建一个CUDAKernel而没有错误(使用命令k = parallel.gpu.CUDAKernel('imageDenoising.ptx', 'uint8_T *, int, int, float, float');)。
但这还不够,因为我错误地认为第一个参数是 RGB 矩阵形式的未处理图像(即 X*Y*3 uint8),所以我得到的结果正是输入,但在第 4 个元素中有 0。
在进行了更多搜索后,我意识到在这样的转换过程中还有一些我完全不知道的其他关键方面(例如 the need to initialize __device__ variables),在这个阶段我决定寻求帮助。
问题
我目前想知道如何有效地从这里继续。虽然我很想知道这种方法是否通常能取得成果(以及这个过程的完整示例是否在某处可用),但我应该注意哪些其他陷阱,以及我可以采取哪些替代行动方案(考虑我在 CUDA 方面的知识非常有限,而且我不会雇用其他人为我做这件事),我记住这是如此,所以我必须有一个 特定的编程问题,所以这里是:
如何修改
imageDenoising.cu以使从中构造的MATLABCUDAKernel也接受未处理的图像作为输入?
注意:在我的应用程序中,输入矩阵是一个二维、灰度、double 矩阵。
附言
一段工作代码显然会受到欢迎,但我真的更愿意“学会钓鱼”。
【问题讨论】:
标签: matlab image-processing cuda filtering gpgpu