使用GPU计算稀疏数据

时间:2012-05-30 17:27:24

标签: matlab optimization gpu sparse-matrix

我在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,这是一个非常小的价值。所以,我想避免计算所有 x (i)>的功能。 10只需设置 f x (i))= 0。

我可以使用 x 的稀疏矩阵表示。但是,并行计算工具箱不支持对GPU上的稀疏矩阵进行操作。

你会怎么做?

2 个答案:

答案 0 :(得分:1)

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

  

所以,我想避免计算所有x(i)>的函数。 10 by   只需设置f(x(i))= 0。

这绝不是一种真正“稀疏”的数值方法。这只是“避免在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);    

当您想要在工作区中重新获得计算时,请使用gather

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

注意:我尚未测试此代码

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

答案 1 :(得分:1)

虽然并行计算工具箱不支持GPU上的稀疏矩阵运算,但Jacket确实如此。因此,一种可能的方法是简单地使用不同的工具。

免责声明是我在夹克上工作,但我确实认为这对你有益,因为它支持你想做的事情和PCT不做的事情,以及reasons here