Matlab 基于GPU的稀疏数据计算

Matlab 基于GPU的稀疏数据计算,matlab,optimization,gpu,sparse-matrix,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,这是一个非常小的值。因此,我希望通过简单地将f(x(I))=0来避免

我在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。然而,并行计算工具箱不支持在GPU上对稀疏矩阵进行操作


您将如何处理此问题?

请注意:此方法是一种解决问题的方法:

因此,我希望避免计算所有x(I)>10的函数 简单地设置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);    
注意:我尚未测试此代码


您应该将其中一些初始化(可能是
x_sp
ix
)结合起来,以节省内存并加快进程。老实说,工作区和GPU之间的初始化和数据传输实际上可能会使整个过程比以前慢。除了试试,别无选择

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


免责声明是,我在Jacket上工作,但我真的认为它在这方面会对您有所帮助,因为它支持您想做的事情,而PCT不支持。对于。我推荐两种实现,一种是稀疏矩阵,另一种是GPU计算。做一些分析,然后选择哪个更适合你。谢谢。我测试了它:GPU实现(在完整矩阵上)比使用稀疏矩阵的CPU实现快一点。只是想知道我是否能在gpu上优化代码。向量x非常稀疏。请参见下面的答案。这可能是您想要的。奇怪的是,在您的实际实现中,
xcpu
有多大?xcpu可以有100000到1000000个元素。此外,函数
f=exp(-x)
被调用了数千次。指数函数实际上比exp(-x)更复杂,它类似于exp(-x^2/sigma)。因此,每个元素的计算量都比我在示例中给出的要多一点,其中说明“无法从parallel.gpu.GPUArray转换为double”。然而,行
f(ix)=exp(-x_sp)在CPU上执行得很好。啊,忘了。请尝试我的更新答案。此版本可以工作,但可能因为
聚集
命令而太慢。我更喜欢将结果保存在gpu上,以便进一步处理。我将测试性能。这很好,但问题是
f
在CPU上,而
exp(-x_gpu)
在gpu上。要从CPU转到GPU,需要使用
gather
。因此,无论如何,在我的示例中,不要使用
gather
,但为了将数据返回到工作区(在CPU上),最终需要使用
gather
f_cpu = gather(f_gpu);         % GPU --> workspace