我将尝试使用 CUDA 优化一些用 MATLAB 编写的代码。我最近开始编写 CUDA,但我对它的工作原理有了大致的了解。
所以,假设我想将两个矩阵相加。在 CUDA 中,我可以编写一个算法,利用线程计算结果矩阵中每个元素的答案。但是,这种技术不是可能类似于 MATLAB 已经做的吗?那样的话,效率岂不是独立于技术,只归于硬件层面?
我将尝试使用 CUDA 优化一些用 MATLAB 编写的代码。我最近开始编写 CUDA,但我对它的工作原理有了大致的了解。
所以,假设我想将两个矩阵相加。在 CUDA 中,我可以编写一个算法,利用线程计算结果矩阵中每个元素的答案。但是,这种技术不是可能类似于 MATLAB 已经做的吗?那样的话,效率岂不是独立于技术,只归于硬件层面?
该技术可能类似,但请记住,使用 CUDA,您可以同时运行数百个线程。如果 MATLAB 正在使用线程并且这些线程在四核上运行,那么每个时钟周期您只会执行 4 个线程,而您可能会在 CUDA 上以相同的时钟周期运行数百个线程。
因此,回答您的问题,是的,此示例中的效率与技术无关,仅归因于硬件。
答案是肯定的,所有的效率都是硬件级别的。我不知道 matlab 是如何工作的,但 CUDA 的优点是可以同时执行多个线程,这与 matlab 不同。
附带说明一下,如果您的问题很小,或者需要许多读写操作,那么 CUDA 可能只是一个额外的麻烦。
CUDA 对 matlab 有官方支持。
[需要链接]
您可以使用 mex 文件从 MATLAB 在 GPU 上运行。
瓶颈是数据从 CPU-RAM 传输到 GPU 的速度。因此,如果传输被最小化并以大块的形式完成,那么加速非常好。
对于简单的事情,最好使用 Matlab PCT 中的 gpuArray 支持。你可以在这里查看 http://www.mathworks.de/de/help/distcomp/using-gpuarray.html
对于诸如添加 gpuArrays、乘法、最小值、最大值等的事情,他们使用的实现往往是可以的。我确实发现要进行诸如 abs(y-Hx).^2 之类的小矩阵的批量操作之类的事情,最好编写一个小内核来为你做这件事。