我的应用程序涉及使用Eigen编写的大量矩阵乘法。我想为它制作GPU计算后端,同时保持仅在CPU上运行的能力,并在可用时由MKL加速。
问题: 以与CPU后端共享尽可能多的代码的方式添加GPU计算后端。
实现GPU加速的最简单方法是使用Eigen-magma,但这是非常有限的,因为在每次操作时都会有不必要的副本从主内存到GPU内存来回,这限制了性能提升一个人可以从GPU获得。
知道我必须彻底抛弃Eigen并重写应用程序但是最好的方法是什么,而没有完全独立的CPU和GPU计算后端代码路径?
答案 0 :(得分:2)
使用CUDA6和自动管理内存功能,您可以通过让驱动程序在必要时执行它们来轻松避免这些额外副本。应该很容易使Eigen-magma适应这个特征。这是我们计划在Eigen内原生支持CUDA的方式。
答案 1 :(得分:0)
对于更通用的案例,您可以采取以下几种方法:
__host__ __device__
。运行时开关可以更改生成的代码是否具有迭代的for循环调用__host__ __device__
函数或调用它的__global__
函数的元素。不同架构之间共享代码的不可避免的问题是性能。您不能指望代码在X86 / NVIDIA / AMD / Xeon Phi上具有快速性和可移植性。由于单个代码旨在在多个体系结构上运行,我认为OpenACC可能是最好的方法,但相对于使用特定体系结构编写的代码,您仍然会在表上留下很多性能。