我在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上的稀疏矩阵进行操作。
你会怎么做?
答案 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_sp
或ix
)来节省内存并加快进程。老实说,工作空间和GPU之间的初始化和数据传输实际上可能会使整个过程比以前更慢。没有什么可做的,只能尝试一下!
答案 1 :(得分:1)
虽然并行计算工具箱不支持GPU上的稀疏矩阵运算,但Jacket确实如此。因此,一种可能的方法是简单地使用不同的工具。
免责声明是我在夹克上工作,但我确实认为这对你有益,因为它支持你想做的事情和PCT不做的事情,以及reasons here。