【问题标题】:Least onerous way to implement generic formatted stream output in CUDA?在 CUDA 中实现通用格式化流输出的最简单方法?
【发布时间】:2019-10-16 19:20:09
【问题描述】:

我希望能够写出接近于:

std::cout << "Hello" << my_world_string << ", " << std::setprecision(5) << my_double << '\n';

在 CUDA 设备端代码中,用于调试模板化函数 - 并且这种代码行会产生单个完整的输出行(即相当于单个 CUDA printf() 调用 - 通常不会' t 被其他线程的输出破坏)。

当然,这是不可能的,因为设备端代码中没有文件或文件描述符,std::ostream 代码也不能在设备端代码中使用。本质上,我们必须使用的是 CUDA 的硬件+软件 hack 启用 printf()s。但显然有可能得到类似的东西:

stream  << "Hello" << my_world_string << ", " << foo::setprecision(5) << my_double << '\n'; 
stream.flush();

或:

stream  << "Hello" << my_world_string << ", " << foo::setprecision(5) << my_double << '\n'; 
printf("%s", stream.str());

我的问题是:我应该实现什么才能让我编写尽可能接近上述的代码,从而最大限度地减少编写代码的工作量/数量?

注意事项:

  • 我使用了标识符stream,但它不一定是流。代码也不需要看起来像我列出的那样。关键是我能够在模板化的设备函数中打印代码。
  • 所有代码都将使用 C++11 编写。
  • 代码可能假定编译是使用 C++11 或更高版本的标准执行的。
  • 我可以使用现有的 FOSS 代码,但前提是它的许可证是许可的,例如3-BSD、CC-BY-SA、MIT - 但不是 GPL。

【问题讨论】:

    标签: c++ debugging cuda iostream stringstream


    【解决方案1】:

    目前,我正在考虑的实现方式是:

    • 实现一个类似std::ostringstream 的类,该类可以从其他地方获取其初始存储(在构建中)。
    • 有了这样的对象,你就可以printf("%s\n", my_gpu_sstream.str())
    • 允许使用固定大小的缓冲区构造 GPU-ostringstream。
    • 允许 GPU-ostringstream 使用 CUDA 的设备端 malloc() 分配可变大小的缓冲区。

    鲍勃是你的叔叔。

    但是,我真的宁愿避免自己实现一个成熟的字符串流。似乎有很多多余的工作和代码。

    编辑:完成!我现在在我的cuda-kat library 中有一个工作实现。我使用了 robhz786 的strf library,它是不基于标准流的(仅当您喜欢时使用标题)字符串格式化库。在此基础上,我实现了设备上的字符串流kat::stringstream,并在此基础上实现了"printf'ing ostream" class

    它远非完美:strf 不使用标准库操纵器,并且有自己的填充、设置精度等习惯用法。此外,编译时间相当长。但它非常好用。如果您将其配置为这样做,甚至可以选择在每个打印行前面加上前缀(例如块和线程索引)。输出使用 CUDA 的内在 printf() 机制 - 到达行尾时。

    【讨论】:

    • 听上去,你真正需要做的就是选择basic_stringbuf作为基础并重写sync()函数来做内部printf
    • @Niall:您的意思是正确地继承它,还是复制粘贴basic_stringbuf 的代码?请记住,要将任何内容作为 CUDA 设备端代码运行,它需要是 constexpr 或用 __device__ 装饰。
    • 我看到了复杂性,不记得 constexpr 是什么,如果有的话,可能不值得那么头疼。剥离的字符串流可能更容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 2011-06-10
    • 2015-11-25
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 2011-08-04
    相关资源
    最近更新 更多