首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使应用程序具有CPU和GPU计算后端的最佳方法是什么?

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

Stack Overflow用户
提问于 2014-09-23 11:30:04
回答 2查看 440关注 0票数 2

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

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

实现GPU加速的最简单的方法是使用本征岩浆,但是这是相当有限的,因为在每次操作中都有从主存到GPU内存的不必要的副本,这限制了从GPU获得的性能增益。

知道我将不得不完全抛弃本征并重写应用程序,但是如果没有CPU和GPU计算后端的完全独立的代码路径,那么最好的方法是什么呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-23 13:58:44

使用CUDA6和自动托管内存特性,您可以通过让驱动程序执行这些额外的副本来轻松地避免这些额外的副本。应该很容易使本征岩浆利用这一特征。这就是我们计划在本地区支持CUDA的方式。

票数 3
EN

Stack Overflow用户

发布于 2014-09-23 16:01:14

对于更一般的情况,您可以采取以下几种方法:

  1. CUDA允许为主机和设备编译函数(使用__host__ __device__ )。运行时开关可以更改生成的代码是否有一个for循环,循环遍历调用__host__ __device__函数的元素还是调用它的__global__函数。
  2. OpenACC可能是最接近性能可移植方法的方法。它是基于指令的,因此后端有更多的余地来优化目标平台。尽管如此,如果您正在处理特定的体系结构,那么您很可能能够在手工编码实现方面优于它。有多少会随着问题和程序员的能力而变化。由于是基于指令的,要为主机编译,只需不使用OpenACC标志。
  3. OpenCL.OpenCL和OpenACC一样,可以针对多个平台,但显然是并行的(如CUDA),而不是使用指令。OpenCL对CUDA的利弊不在问题范围之内。

在不同架构之间共享代码不可避免的问题是性能。您不能期望代码在X86/NVIDIA/AMD/Xeon之间既快速又可移植。对于打算在多个体系结构上运行的单个代码,我认为OpenACC可能是最好的方法,但相对于使用特定体系结构编写的代码,您仍然会在表中留下很多性能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25993967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档