在CUDA中实现通用格式化流输出的最麻烦的方法?

问题描述 投票:0回答:1

我希望能够写一些接近的东西:

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

在CUDA设备端代码中,用于调试模板功能-并使此类代码行产生不间断的单个输出行(即,等效于单个CUDA printf()调用-通常不会被其他线程的输出弄糟了。

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

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,麻省理工学院-但不是GPL。
c++ debugging cuda iostream stringstream
1个回答
0
投票

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

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

鲍勃是你的叔叔。

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

© www.soinside.com 2019 - 2024. All rights reserved.