使用GPU加速MATLAB代码?

57

AccelerEyes在2012年12月宣布与Mathworks合作处理GPU代码,并停止了其针对MATLAB的Jacket产品:

http://blog.accelereyes.com/blog/2012/12/12/exciting-updates-from-accelereyes/

不幸的是,他们不再销售Jacket许可证。

据我所知,基于ArrayFire的Jacket GPU数组解决方案比MATLAB提供的gpuArray解决方案快得多。

我开始使用gpuArray,但我发现许多函数实现得很差。例如一个简单的

myArray(:) = 0 

非常缓慢。我编写了一些自定义的CUDA-Kernel,但是实现不佳的标准MATLAB功能会增加很多开销,即使在整个代码中始终使用gpuArrays。我通过用手写的CUDA代码替换MATLAB代码来解决了一些问题,但我不想重新实现MATLAB的标准功能。

我还缺少另一个功能,那就是稀疏GPU矩阵。

所以我的问题是:

如何加速MATLAB提供的默认GPU实现的性能不佳?特别是如何在MATLAB中使用GPU加速稀疏矩阵操作?


24
当然,myArray(:) = 0 的速度较慢-这是将大量零从CPU无故地传输到GPU的原因。这并不意味着MATLAB GPU功能实现不佳,而是需要知道如何使用它们;请尝试使用myArray = gpuArray.zeros(size(myArray)) - Sam Roberts
2
Sam,<code>myArray(:)=0</code> 只需要将一个整数从 CPU 移到 GPU - 如果最优化实现的话。使用 <code>gpuArray.zeros()</code> 甚至更慢。目前我正在使用 <code>myArray = myArray-myArray</code>,虽然更快,但仍然很慢。我希望 Jacket 功能会随着下一个 MATLAB 发布而来。 - Stiefel
4
你正在尝试分配什么大小的数组,觉得速度很慢?请注意,在最近发布的Parallel Computing Toolbox版本中,一些操作是异步执行的。此外,“a = a - a;”不一定会导致全零数组,因此建议避免使用这种模式(提示:如果'a'包含NaN或Inf会怎样?)。如果有性能问题,请联系MathWorks以获取详细信息。 - Edric
3
以下是我从网络上搜集到的内容(第一部分):2011年,MathWorks和AccelerEyes因知识产权问题相互起诉。MathWorks声称AcceleEyes的Jacket产品侵犯了他们Parallel Computing Toolbox产品的专利 [http://www.scribd.com/doc/59765193/MathWorks-v-AccelerEyes-et-al]。 - bla
2
我昨天恰好参加了一个Matlab研讨会,并向Loren Shure和其他TMW人员提出了这个问题。他们拒绝发表评论,我所能得到的最好回答是“有一些正在进行中的事情”。 - bla
显示剩余16条评论
2个回答

4

MATLAB支持CUDA基于GPU加速,需要通过“Parallel Computing Toolbox”访问。希望这两个链接也能够帮到你:

Parallel Computing Toolbox Features (并行计算工具箱特性)

主要特性

  • 用于在多个处理器上运行任务并行算法的并行循环(parfor)
  • 支持基于CUDA的NVIDIA GPU
  • 通过本地运行的worker充分利用桌面上的多核处理器
  • 计算机集群和网格支持(使用MATLAB Distributed Computing Server)
  • 交互式和批处理执行并行应用程序
  • 分布式数组和单程序多数据(spmd)结构,用于大型数据集处理和数据并行算法

MATLAB GPU Computing Support for NVIDIA CUDA-Enabled GPUs (NVIDIA CUDA启用GPU的MATLAB GPU计算支持)

使用MATLAB进行GPU计算可以更轻松地利用CUDA GPU计算技术加速应用程序,而无需学习GPU架构或低级GPU计算库的复杂性。通过熟悉的MATLAB语言,您可以通过Parallel Computing Toolbox使用GPU与MATLAB配合使用,支持以下功能:CUDA启用的NVIDIA GPU,计算能力为2.0或更高版本。对于14a及更早版本,计算能力1.3就足够了。直接从MATLAB使用GPU,包括GPU-enabled MATLAB functions,如fft、filter和几个线性代数操作,GPU-enabled functions in toolboxes,如图像处理工具箱、通信系统工具箱、统计和机器学习工具箱、神经网络工具箱、相控阵系统工具箱和信号处理工具箱(了解有关信号处理算法的GPU支持的更多信息),以及使用仅一行MATLAB代码的CUDA内核集成在MATLAB应用程序中CUDA kernel integration in MATLAB applications。在Parallel Computing Toolbox和MATLAB Distributed Computing Server中使用MATLAB workers,在桌面和计算机集群上使用多个GPU。

3
虽然这些链接可能会回答问题,但您应该避免仅包含链接的答案,并概括或引用文章,因为链接往往会随着时间的推移而失效。 - pinckerman

3

我有幸参加了由AccelerEyes创始人John主持的一个讲座。他们之所以能够获得速度提升,并不是因为只是删除了一些编写不良的代码,然后用保存了几个字节的代码进行替换。他们的大部分速度提升来自于利用缓存的可用性并在内存中(GPU)执行大量操作。如果我没记错的话,Matlab依赖于GPU和CPU之间的数据传输,因此速度提升也是很疯狂的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接