【问题标题】:How to consume and process AVRO data in GPU efficiently?如何高效地使用和处理 GPU 中的 AVRO 数据?
【发布时间】:2019-07-19 04:04:54
【问题描述】:

要求:

  1. 我有一个生成 AVRO 数据的应用程序(大约每小时 100 GB)。
  2. 我想创建另一个应用程序来读取生成的 AVRO 数据(每小时)并在 GPU 中转换数据

AVRO 生成的示例类(不准确,只是为了介绍我的情况):

struct XXX {
    std:string s1;
    std:string s2;
    int i1;
    float f1; 
}

struct YYY { 
    XXX x1;
    XXX x2;
    std:string s1;
    int i1;
}

问题:

  1. 反序列化 AVRO 记录后,它在嵌套结构中包含 std::string
  2. GPU 不支持 std::string

问题:

有没有办法将反序列化的 AVRO 记录原样发送到 GPU 进行进一步处理?

如果这个问题看起来很幼稚,请多多包涵,因为我对 c++ 和 GPU 编程都是新手。

【问题讨论】:

  • struct YYY 可能有 struct XXX 的内部对象。很抱歉造成混乱。
  • 删除了 typedef
  • 查看here 了解typedef 的实际作用。如今typedef 在 C++ 中基本上已经过时了(using 代替别名)
  • 谢谢,但我只是复制了 AVRO 生成的类。
  • 我不知道你的原始代码,也许它在那个地方有typedefs,但似乎你想要有成员......代码没有错,只是不清楚@987654327是什么@对有好处

标签: c++ c++11 cuda avro


【解决方案1】:

使用 GPU 的目的是什么?是性能吗?因为了解机器如何解释代码比使用 GPU 效率要高得多。如果您使用的是 AVRO 代码生成器(您在上面声明),您将不会获得真正的性能改进。我编写了一些自定义的 Avro 序列化程序,并在生成的代码的序列化方面得到了 100 倍的改进。如果您想将反序列化转换为 GPU,我建议您首先为您的特定 Avro 架构手动编写一个反序列化器,然后尝试将其转换为 GPU。

【讨论】:

  • 正如您正确指出的那样,目的是提高性能。我尝试了 spark(有 10 个执行者),但无法达到预期的性能。我将尝试自定义反序列化器的想法。
  • 你能指导我如何编写自定义 Avro 序列化器吗?
  • 在这里查看 avro 规范:avro.apache.org/docs/current/spec.html
  • 这里也可以看看C源代码:github.com/apache/avro/tree/master/lang/c
  • 最后,您应该使用生成的代码进行比较。使用生成的代码对您的数据进行序列化(没有任何速度改进),并将输出与您生成的任何自定义结果进行比较。
【解决方案2】:

不确定这是否有帮助,但 cudf 有一个用于 avro 文件的 gpu 加载程序并支持字符串 https://github.com/rapidsai/cudf

【讨论】:

猜你喜欢
  • 2010-10-03
  • 2014-11-30
  • 1970-01-01
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多