首先:
所以现在我的问题是,我习惯于使用编程进行不同的科学计算。在复杂性和计算次数方面,我使用的一些东西非常紧张。所以我想知道,也许我可以使用OpenCL加快速度。
所以,我希望听到你们所有人的回答是以下一些[链接奖励]:
*什么样的计算/算法/一般问题适合OpenCL
*确定某些特定代码是否会因迁移到OpenCL而受益的一般原则是什么?
此致
答案 0 :(得分:9)
我认为这是一个很好的问题,而且我正在努力为自己的研究工作。
目前,在GPU可以做什么方面存在很大的局限性,因为它们需要各个线程在不同的数据集上执行完全相同的代码,即问题/算法必须是“数据并行”。显然,数据并行问题包括蒙特卡罗模拟(其中许多MC模拟并行执行),图像处理和不太明显的分子动力学模拟。数值积分(蒙特卡罗或其他)是另一种科学应用程序,可以轻松移植到GPU上运行。另一个主要限制是每个线程的内存非常有限,因此要在GPU上有效执行,算法必须具有高算术强度。算法成为在GPU上运行的候选者的必要但不充分的条件是在CPU上算法必须是强大的CPU绑定而不是内存限制。
我的观点是,随着时间的推移,越来越多的问题将被扼杀,以便使用这种范例可以解决这些问题只是因为要获得如此大的性能提升,但是低悬的果实是明显的数据并行问题。在我看来,大规模多核编程将在未来十年内在科学界越来越重要和普遍。
我已经玩了很多,并设法将回溯问题转换为适当的格式,以便在GPU上执行(使用CUDA)。仅供参考,我在演讲中描述了这一点:http://lattice.complex.unimelb.edu.au/home/sites/default/files/mydocuments/clisby_cuda0509.pdf
答案 1 :(得分:3)
它非常适合于可以表示为在大块简单数据结构上并行工作的小程序的任务。
如果想要计算两个图像之间的差异,OpenCL适合您。如果你想对场景进行光线追踪,那有点困难但仍然可行。如果您已经回答了大量的Web服务请求,那么OpenCL就不是解决方案。
答案 2 :(得分:2)
就算法而言,它们必须是数据并行的。这是一组数据不应该依赖于以前的集合。要进行类比,请考虑插入排序,其中将一个元素与其他元素进行比较以找到正确的位置。这是“非”数据并行,因为每个步骤都需要访问N-1个元素。现在,如果您需要使用openCL进行排序,则必须实现作为一种排序网络的bitonic排序。
即使它们是数据并行的,也存在FLOPS和内存延迟之间的权衡问题。如果必须从全局内存中提取每个数据,那么性能改进可能不会很大。 GPU的内存延迟远远高于CPU。为了解决这个问题,可以使用GPU中的本地存储器。