【问题标题】:Evaluating expressions consisting of elementwise matrix operations in Thrust在 Thrust 中评估由元素矩阵运算组成的表达式
【发布时间】:2013-07-09 02:19:48
【问题描述】:

我想使用 Thrust 来评估由元素矩阵运算组成的表达式。为了清楚起见,让我们考虑如下表达式:

D=A*B+3*sin(C)

其中ABCD 是矩阵,当然大小相同。

Thrust Quick Start Guide 提供了saxpy 示例,其中y 既用作输入又用作输出,而在我的情况下,输出参数与输入参数不同,顺便说一下,输入参数不止两个.在Element-by-element vector multiplication with CUDA,考虑了输出与输入不同但只有两个输入的情况。

有人可以就如何使用 Thrust 实现上述表达式(输出矩阵不同于输入和两个以上的输入)提供一些建议(可能还有背后的理由)吗?谢谢。

【问题讨论】:

  • 你看过Newton吗?这是使用推力的表达式模板的工作原型。
  • @talonmies 不。实际上,我有自己的表达式模板库,并且想针对推力对性能进行基准测试... :-)

标签: cuda thrust


【解决方案1】:

以下是使用Newton 实现该计算的方法,这是 talonmies 评论中提到的库:

#include <newton/newton.hpp>

int main()
{
  float a[4] = {1.0, 1.0, 1.0, 1.0};
  float b[4] = {2.0, 2.0, 2.0, 2.0};
  float c[4] = {3.0, 3.0, 3.0, 3.0};
  float d[4] = {4.0, 4.0, 4.0, 4.0};

  newton::numeric_vector<float> A = a;
  newton::numeric_vector<float> B = b;
  newton::numeric_vector<float> C = c;
  newton::numeric_vector<float> D = d;

  D = A * B + 3.f * sin(C);

  return 0;
}

该库是使用thrust::zip_iteratorthrust::transform_iterator 构建的,用于实现具有任意数量输入的表达式。具体可以参考实现。

【讨论】:

  • 非常感谢您的回答。我一定会看看你使用推力实现的表达式模板。正如我对 talonmies 所提到的,我在 CUDA 中有自己的表达式模板实现,我想弄清楚它与涉及临时对象的“标准”实现相比有多快。因此,我打算使用具有“纯”推力的矩阵运算。我担心的是,如果我按照您的建议使用牛顿,那么我将看不到创建临时对象的效果。你怎么看?
  • D = A * B + 3.f * sin(C) 表达式中没有创建临时对象。分配应导致单个内核启动。
  • 是的,当然。但在我现在的测试中,我确实希望创建临时对象以了解我从表达式模板中获得了多少...
  • 听起来您在问如何尽可能低效地实现该表达式 :) 我想您可以创建诸如 operator+ 之类的函数,该函数采用 device_vector&lt;float&gt; 参数并返回 device_vector&lt;float&gt; 作为价值。此类函数的实现只需使用thrust::transform
  • 在某种意义上,是的 :-) 我验证了通过我的元编程实现评估表达式所花费的时间与通过手写内核相同,所以我很高兴。然后我想将这种性能与现有库的性能进行比较,我想到了推力。但是推力意味着“纯”推力,没有牛顿的帮助 :-) 当然,将我的实现的性能与您自己的库的性能进行比较会很有趣,如果我的我的会倾向于你的,我会很高兴:-) 根据你提到的,用推力进行测试需要一些努力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多