【问题标题】:Computation on sparse data using GPU使用 GPU 计算稀疏数据
【发布时间】:2012-06-04 23:32:48
【问题描述】:

我在 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)) = 来避免计算所有 x(i) > 10 的函数0.

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

你会如何处理这个问题?

【问题讨论】:

  • 我推荐两种实现,一种使用稀疏矩阵,一种使用 GPU 计算。做一些分析,然后选择哪个更适合你。
  • 谢谢。我对其进行了测试:GPU 实现(在完整矩阵上)比 CPU 实现在稀疏矩阵上要快一点。如果我能以某种方式优化 gpu 上的代码,只是徘徊。矢量 x 非常稀疏。
  • 在下面查看我的答案。这可能是你想要的。
  • 好奇,x_cpu 在你的实际实现中有多大?
  • x_cpu 可以有 100,000 到 1,000,000 个元素。函数f = exp(-x) 也被调用了数千次。

标签: matlab optimization gpu sparse-matrix


【解决方案1】:

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

所以,我想避免计算所有 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);    

如果您想将计算返回到工作区,请使用gather

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

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

您应该结合其中一些初始化(x_spix,也许)以节省内存并加快进程。老实说,工作空间和 GPU 之间的初始化和数据传输实际上可能会使整个过程比以前慢。除了尝试之外别无他法!

【讨论】:

  • 指数函数实际上比 exp(-x) 要复杂一些,它类似于 exp(-x^2/sigma)。因此,每个元素的计算量比我在示例中给出的要多。
  • 在gpu上计算f(ix) = exp(-x);行时出现错误,提示“无法从parallel.gpu.GPUArray转换为double”。但是,f(ix) = exp(-x_sp); 行在 CPU 上执行得很好。
  • 啊,忘了gather。试试我更新的答案。
  • 这个版本可以工作,但可能因为gather 命令太慢了。我更喜欢将结果保存在 gpu 上以供进一步处理。我会测试性能。
  • 这很好,但问题是f 在 CPU 上,而exp(-x_gpu) 在 GPU 上。要从 CPU 转到 GPU,您需要使用 gather。因此,无论如何,不​​要在我的示例中使用gather,但是为了将您的数据恢复到工作区(在CPU上),您最终需要使用gather
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2018-05-11
    • 1970-01-01
    • 2023-03-28
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    相关资源
    最近更新 更多