使应用程序具有CPU和GPU计算后端的最佳方法是什么

时间:2014-09-23 11:30:05

标签: c++ cuda eigen

我的应用程序涉及使用Eigen编写的大量矩阵乘法。我想为它制作GPU计算后端,同时保持仅在CPU上运行的能力,并在可用时由MKL加速。

问题: 以与CPU后端共享尽可能多的代码的方式添加GPU计算后端。

实现GPU加速的最简单方法是使用Eigen-magma,但这是非常有限的,因为在每次操作时都会有不必要的副本从主内存到GPU内存来回,这限制了性能提升一个人可以从GPU获得。

知道我必须彻底抛弃Eigen并重写应用程序但是最好的方法是什么,而没有完全独立的CPU和GPU计算后端代码路径?

2 个答案:

答案 0 :(得分:2)

使用CUDA6和自动管理内存功能,您可以通过让驱动程序在必要时执行它们来轻松避免这些额外副本。应该很容易使Eigen-magma适应这个特征。这是我们计划在Eigen内原生支持CUDA的方式。

答案 1 :(得分:0)

对于更通用的案例,您可以采取以下几种方法:

  1. CUDA 允许为主机和设备编译函数(使用__host__ __device__。运行时开关可以更改生成的代码是否具有迭代的for循环调用__host__ __device__函数或调用它的__global__函数的元素。
  2. OpenACC 可能是最接近性能便携式方法的。它是基于指令的,因此后端在针对目标平台进行优化方面有更多的余地。也就是说,如果你的目标是特定的架构,你可能会通过手工编码实现超越它。多少因问题和程序员的能力而异。基于指令,为主机编译,你只是不使用OpenACC标志。
  3. 的OpenCL 即可。 OpenCL与OpenACC一样,可以针对多个平台,但是要明确地并行化(如CUDA),而不是使用指令。 OpenCL与CUDA的利弊超出了问题的范围。
  4. 不同架构之间共享代码的不可避免的问题是性能。您不能指望代码在X86 / NVIDIA / AMD / Xeon Phi上具有快速性和可移植性。由于单个代码旨在在多个体系结构上运行,我认为OpenACC可能是最好的方法,但相对于使用特定体系结构编写的代码,您仍然会在表上留下很多性能。