3

我在 Matlab 中计算一个函数f ( x ) = exp(- x ),其中x是一个标量向量。该函数在 GPU 上计算,例如

x_cpu = [4 5 11 1];
x = gpuArray(x_cpu);
f = exp(-x);

那么结果将是:

f = exp(-[4, 5, 11, 1]) = [0.183, 0.0067, 1.6702e-005, 0.3679]。

请注意,f ( x (3)) = f (11) = exp(-11) = 1.6702e-005 = 0.000016702,这是一个非常小的值。因此,我想通过简单地设置f ( x (i)) = 0来避免计算所有x (i) > 10 的函数。

我可能可以使用x的稀疏矩阵表示。但是,Parallel Computing Toolbox 不支持在 GPU 上对稀疏矩阵进行运算。

你会如何处理这个问题?

4

2 回答 2

1

请注意:此方法是一种解决方法,旨在解决问题中的陈述:

因此,我想通过简单地设置 f(x(i)) = 0 来避免计算所有 x(i) > 10 的函数。

这绝不是一种真正的“稀疏”数值方法。这只是在 MATLAB 的 GPU 上“避免计算所有 x(i) > 10 的函数”的一种手段

% original input vector
x_cpu = [4 5 10 1 13 8 9]; 

% logical indeces of x where exp(-x) is significant
ix = x_cpu <= 10;

% values of x where exp(-x) is significant ("sparse" x)
x_sp = x_cpu(ix);

% Load our "sparse" vector to GPU
x_gpu = gpuArray(x_sp);

% create a vector of zeros for function output on GPU
f_gpu = parallel.gpu.GPUArray.zeros(size(x_cpu)); 

% do the calculations only for the "sparse" matrix on the GPU
f_gpu(ix) = exp(-x_gpu);    

当您想在工作区中恢复计算时,请使用collect

f_cpu = gather(f_gpu);         % GPU --> workspace

注意:我没有测试过这段代码

您应该结合其中一些初始化(x_sp或者ix,也许)以节省内存并加快进程。老实说,工作空间和 GPU 之间的初始化和数据传输实际上可能会使整个过程比以前慢。没有什么可做的,但试试吧!

于 2012-05-30T17:59:23.930 回答
1

虽然 Parallel Computing Toolbox 不支持 GPU 上的稀疏矩阵运算,但 Jacket 支持。因此,一种可能的方法是简单地使用不同的工具。

免责声明是我在 Jacket 上工作,但我真的认为这对你有好处,因为它支持你想做的事情,而 PCT 不做,原因在这里

于 2012-06-22T15:04:32.357 回答