在matlab中使用多个GPU

pyC*_*uda 9 parallel-processing matlab cuda gpu image-processing

这是使用Jacket/matlab的ginfo的输出:

Detected CUDA-capable GPUs:
CUDA driver 270.81, CUDA toolkit 4.0
GPU0 Tesla C1060, 4096 MB, Compute 1.3 (single,double) (in use)
GPU1 Tesla C1060, 4096 MB, Compute 1.3 (single,double)
GPU2 Quadro FX 1800, 742 MB, Compute 1.1 (single)
Display Device: GPU2 Quadro FX 1800
Run Code Online (Sandbox Code Playgroud)

问题是 :

  1. 我可以同时使用两个特斯拉(parfor)吗?怎么样?
  2. 如何知道当前正在运行/执行程序的核心数?
  3. 在运行以下代码并制作Quadro(使用中)之后,我发现尽管特斯拉拥有240个内核且Quadro只有64个,但它比特斯拉需要更少的时间?也许是因为它是显示设备?也许是因为它的单精度和特斯拉是双精度?
clc; clear all;close all;
addpath ('C:/Program Files/AccelerEyes/Jacket/engine');
i = im2double(imread('cameraman.tif'));
i_gpu=gdouble(i);
h=fspecial('motion',50,45);% Create predefined 2-D filter
h_gpu=gdouble(h);
tic;
for j=1:500
    x_gpu = imfilter( i_gpu,h_gpu );
  end
i2 = double(x_gpu); %memory transfer 
t=toc
 figure(2), imshow(i2);
Run Code Online (Sandbox Code Playgroud)

任何有关代码的帮助将不胜感激.正如您所看到的,用于演示GPU功能的非常简单的示例,已不复存在.

use*_*795 1

同时使用两个 Tesla:编写一个 MEX 文件并调用cudaChooseDevice(0),启动一个内核,然后调用cudaChooseDevice(1)并执行另一个内核。内核调用和内存复制(即cudaMemcpyAsynccudaMemcpyPeerAsync)是异步的。我在我的其他答案之一中给出了一个关于如何编写 MEX 文件(即 DLL)的示例。只需向该示例添加第二个内核即可。仅供参考,如果您可以进行一些 C/C++ 编程,则不需要 Jacket。另一方面,如果您不想花时间学习Cuda SDK或者您没有 C/C++ 编译器,那么您将不得不使用 Jacket 或gp-youGPUlibparfor ,直到 Matlab 改变工作方式。

另一种方法是从 Matlab调用OpenCL (同样通过 MEX 文件)。然后您可以在所有 GPU 和 CPU 上启动内核。同样,这需要一些 C/C++ 编程。