在matlab中使用多个GPU

时间:2011-12-04 21:25:41

标签: matlab image-processing cuda parallel-processing gpu

这是使用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

问题是:

  1. 我可以同时使用两个特斯拉(parfor)吗?怎么样?
  2. 如何知道当前正在运行/执行程序的核心数?
  3. 运行以下代码并制作Quadro(正在使用中)后发现尽管特斯拉拥有240个核心且Quadro只有64个,但它比特斯拉花费的时间更少?也许是因为它是显示设备?也许因为它是单精度而特斯拉是双精度?
  4. 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);
    

    对此代码的任何帮助将不胜感激。正如你所看到的那样,用来演示GPU的强大功能是非常简单的例子。

2 个答案:

答案 0 :(得分:1)

同时使用两个Teslas :编写MEX文件并调用cudaChooseDevice(0),启动一个内核,然后调用cudaChooseDevice(1)并执行另一个内核。内核调用和内存副本(即cudaMemcpyAsynccudaMemcpyPeerAsync)是异步的。我给出了一个如何在one of my other answers中编写MEX文件(即DLL)的示例。只需在该示例中添加第二个内核即可。仅供参考,如果您可以进行一些C / C ++编程,则不需要Jacket。另一方面,如果你不想花时间学习Cuda SDK或者你没有C / C ++编译器,那么你就会遇到Jacket或gp-you或{{3直到Matlab改变了parfor的工作方式。

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

答案 1 :(得分:0)

从Matlab 2012开始,GPU阵列和GPU相关功能完全集成到MATLAB中,因此您可能不需要使用Jacket来实现您的目标。

总之,在运行GPU命令之前放置gpuDevice(deviceID);,然后将在deviceID gpu上运行以下代码。例如

gpuDevice(1);
a = gpuArray(rand(3)); // a is on the first GPU memory
gpuDevice(2);
b = gpuArray(rand(4)); // b is on the second GPU memory

运行多个GPU。简单地说就是

c = cell(1,num_device);
parfor i = 1:num_device
    gpuDevice(i);
    a = gpuArray(magic(3));
    b = gpuArray(rand(3));
    c{i} = gather(a*b);
end

您可以通过在系统命令行上键入nvidia-smi来查看GPU内存使用情况。

这种设置GPU ID的方式看起来很奇怪,但这是设置GPU ID的传统方式。在CUDA中,如果您想使用特定GPU,则cudaSetDevice(gpuId)以下代码将在gpuId GPU上运行。 (0基索引)

---------------------- EDIT ----------------

在MATLAB 2012b,MATLAB 2013b上测试并确认。

使用nvidia-smi检查代码实际上是否使用不同的GPU内存。您可能需要将其扩展为非常大rand(5000)并快速检查,因为在for循环结束后临时变量ab将消失