我是一名新的OpenCL程序员,刚进入GPGPU计算,我使用的是Nvidia Quadro 600。 我正在进行基于GPU编程的研究工作,我的目标是使用SIMT方法为OpenCL编写一个简单的卡尔曼滤波器内核。我找到了this文档,该文档描述了如何使用CUDA完成原理,我认为这是OpenCL的类似方法。
卡尔曼滤波器在线性系统上完成的基本操作是三个方程,每个方程涉及矩阵操作,计算卡尔曼增益矩阵(K),状态估计(x~),并更新误差协方差矩阵(P )用于下一个状态估计。对于从实际系统获得的每个测量,迭代这三个步骤。 考虑到SIMT方法,我想在线程块内的每个gpu线程上执行kalman过滤器的一次迭代,我发送到计算迭代所需的每个线程值(来自真实系统测量的输入和输出,线性系统矩阵) 。
我可以考虑使用OpenCL来完成这个算法的一些更好的设计吗? 以并行方式在单独的内核上进行矩阵运算是可能的(也是有用的)?
另一个问题:假设我们有k次迭代,对于每次迭代k我们计算步骤k + 1的P,将来自迭代k-1的步骤k的P作为输入...因为每个胎面计算一次迭代,所以可以同步线程k以等待来自线程k-1的P矩阵
UPDATE :经过多次搜索和尝试后,我认为不可能将我的实现(如上所述)适应OpenCL操作原则。我发现这样做的唯一方法是并行化每个单矩阵运算,可能使用更多的GPU同时计算每个矩阵运算。使用大线性系统进行滤波可以实现这种实现的真正效率(这意味着:它适用于大矩阵)。