OpenCl和幂迭代方法(特征分解)

时间:2014-01-31 09:26:06

标签: opencl gpgpu

我是OpenCL的新手,我正在尝试实现功率迭代方法(描述为over here) 矩阵大小超过100000x100000!

其实我不知道如何实现这个。 这是因为工作组有限制CL_DEVICE_MAX_WORK_GROUP_SIZE(因此我无法使用1000000个工作项创建一个工作组) 但是在迭代的每一步中我都需要同步和规范化向量。

1)那么可以在一个内核中进行所有计算吗? (如果矩阵大小超过CL_DEVICE_MAX_WORK_GROUP_SIZE,我认为答案是否定的)

2)我可以在主机代码中进行“while”循环吗?在这种情况下使用GPU仍然有利可图吗? 就像是: 而(条件)

{

内核调用

同步

}

1 个答案:

答案 0 :(得分:1)

  • 2:是的,您可以在主机代码中进行while循环。这在性能方面是否仍然有利可取取取决于所调用的内核是否实现了良好的加速。我个人偏好将太多逻辑打包到单个内核中,因为较小的内核更易于维护,有时更容易优化。但是,当然,调用内核会产生(小)开销,必须将其考虑在内。是否与内核组合成一个可以带来加速(或新的优化潜力)取决于内核实际正在做什么。但在这种情况下(Matrix Multiplation和Vector Normalization)我个人会从两个不同的内核开始,这些内核在while循环中从主机调用。

  • 1:由于具有浮点值的100000x100000矩阵将占用至少40GB的内存,因此无论如何您都必须考虑这种方法。关于Matrix操作,它们的并行化以及GPU上的相应实现,有大量文献。从“高级”观点来看,一个重要方面是矩阵是密集还是稀疏http://en.wikipedia.org/wiki/Sparse_matrix)。根据稀疏性,甚至可以在主存储器中处理100000x100000矩阵。除此之外,您可以考虑查看用于矩阵运算的库(例如http://viennacl.sourceforge.net/),因为实现有效的矩阵乘法具有挑战性,特别是对于稀疏矩阵。但是如果你想自己全力以赴:祝你好运;-)和...... CL_DEVICE_MAX_WORK_GROUP_SIZE对问题大小没有限制。实际上,OpenCL中的问题大小(即工作项的总数)几乎无限大。如果您的CL_DEVICE_MAX_WORK_GROUP_SIZE为256,并且您想要处理10000000000个元素,那么您将创建10000000000/256个工作组,并让OpenCL关注它们实际调度和执行的方式。对于矩阵运算,当您想要使用本地内存时,CL_DEVICE_MAX_WORK_GROUP_SIZE主要是相关的(为了获得良好的性能,您必须这样做):工作组的大小因此隐式定义了本地内存块的大小。