3

我是一名新的 OpenCL 程序员,刚刚进入 GPGPU 计算领域,我正在使用 Nvidia Quadro 600。我正在基于 GPU 编程进行研究工作,我的目标是使用 SIMT 为 OpenCL 编写一个简单的卡尔曼滤波器内核方法。我发现这个文档描述了如何使用 CUDA 完成的原理,我认为这与 OpenCL 的方法类似。

卡尔曼滤波器对线性系统所做的基本操作是三个方程,每个方程都涉及矩阵操作,计算卡尔曼增益矩阵 (K)、状态估计 (x~),并更新误差协方差矩阵 (P)下一个状态估计。这三个步骤针对从实际系统中进行的每个测量进行迭代。考虑到 SIMT 方法,我想在线程块内的每个 gpu 线程上执行一次卡尔曼滤波器迭代,我向每个线程发送计算迭代所需的值(来自真实系统测量的输入和输出,线性系统矩阵) .

有一些更好的设计我可以考虑用 OpenCL 来完成这个算法?以并行方式在单独的内核上进行矩阵运算是可能的(并且有用的)?

另一个问题:假设我们有 k 次迭代,对于每次迭代 k,我们计算步 k+1 的 P,将迭代 k-1 中步 k 的 P 作为输入...由于每个胎面计算一次迭代,因此可以同步线程 k 以等待来自线程 k-1 的 P 矩阵?

更新:经过多次搜索和尝试,我认为不可能使我的实现(如上所述)针对这个问题适应 OpenCL 的操作原则。我发现这样做的唯一方法是并行化每个单个矩阵运算,可能使用更多 GPU 同时计算每个矩阵运算。这种实现的真正效率可以通过大线性系统进行过滤来实现(这意味着:它适用于大矩阵)。

4

0 回答 0