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