这是使用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
问题是:
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的强大功能是非常简单的例子。
答案 0 :(得分:1)
同时使用两个Teslas :编写MEX文件并调用cudaChooseDevice(0)
,启动一个内核,然后调用cudaChooseDevice(1)
并执行另一个内核。内核调用和内存副本(即cudaMemcpyAsync
和cudaMemcpyPeerAsync
)是异步的。我给出了一个如何在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循环结束后临时变量a
和b
将消失