【问题标题】:sprintf-like function for CUDA device-side code?用于 CUDA 设备端代码的类似 sprintf 的函数?
【发布时间】:2022-04-25 03:27:45
【问题描述】:

我在互联网上找不到任何东西。由于可以在__device__ 函数中使用printf,我想知道是否有类似sprintf 的函数,因为printf 正在“使用”来自sprintf 的结果显示在stdout

【问题讨论】:

    标签: cuda printf


    【解决方案1】:

    不,CUDA 中没有为此内置任何东西。

    在 CUDA 中,设备 printf 的实现是一种特殊情况,它不使用与 C 库 printf 相同的机制。

    【讨论】:

    • 确实,docs.nvidia.com/cuda/cuda-c-programming-guide/#formatted-output 表示“printf() 输出的最终格式化发生在主机系统上。”因此他们甚至不必在设备代码中实现“类似 sprintf 的功能”。我听说旧的 cuPrintf 就是这样工作的。当然,您可以找到许多可以使用 cuda 编译的(简化的)sprintf 实现。
    • 虽然实际打印部分确实是一种特殊情况,而且完全不像 sprintf,但还有格式字符串的解析,可能还有更多的编组缓冲区代码也许可以与sprintf() 实现共享。
    • @masterxilo “当然你可以找到很多...的实现”——这似乎不是真的。
    • @masterxilo :我最终选择了更受欢迎的mpaland printf(),但由于该存储库被放弃了,我统一了所有的分支,承担了维护工作,以及fixed many bugs and other issues。这导致了:eyalroz/printf,我现在可以推荐它作为任何系统的独立实现。
    【解决方案2】:

    sprintf()snprintf() 和其他 printf()-family 函数现在可在 CUDA Kernel Author's Toolkit(又名 cuda-kat)的开发分支上使用。签名:

    namespace kat {
    
    __device__ int sprintf(char* s, const char* format, ...);
    __device__ int snprintf(char* s, size_t n, const char* format, ...);
    
    }
    

    ... 他们完全按照您的预期行事。特别是,它们支持 CUDA printf() 的 C 标准特性,然后是一些(例如,使用额外参数指定字符串参数的字段宽度;size_t 和 @987654328 的格式说明符@,并以 base-2 打印)。

    警告:我是 cuda-kat 的作者,所以我有偏见......


    总是更喜欢snprintf(),它占用缓冲区大小而不是sprintf(),这可能会溢出。

    【讨论】:

      猜你喜欢
      • 2015-09-09
      • 2020-03-30
      • 2018-08-08
      • 2019-01-05
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      • 2015-07-12
      相关资源
      最近更新 更多