【问题标题】:Write result into text file in CUDA / Optix将结果写入 CUDA / Optix 中的文本文件
【发布时间】:2023-03-12 20:32:01
【问题描述】:

我想知道是否可以编写一个包含在我的程序 Cuda / Optix 中计算的变量的文本文件。那是变量在我的 .cu 文件中,因此不能由 CPU 写入。

【问题讨论】:

    标签: cuda optix


    【解决方案1】:

    据我所知,不可能从 CUDA 内核执行文件 I/O。您需要使用cudaMemcpy 并将数据复制回主机内存,然后您可以从那里将值写入文件。

    【讨论】:

      【解决方案2】:

      我没有使用 Optix 的经验,但据我所知,没有办法从 CUDA 写入文件。您应该将值下载到主机,以便将它们存储到文件中。

      您可以使用cudaMemcpy( dstPointer, srdPointer, size, cudaMemcpyDeviceToHost); 将数据从设备 (GPU) 复制到主机 (CPU)。见:NVIDIA CUDA Library: cudaMemcpy 请注意,您的 dstPointer 必须足够大才能存储数据!

      【讨论】:

        【解决方案3】:

        正如前面的答案所暗示的,不可能通过 CUDA 内核将数据写入文件。如果您的代码涉及多个循环,您可能会想您的程序在每个循环上传输和写入数据的速度有多慢;如果是这样,您应该在给定数量的循环后进行数据传输。换句话说,将文件写入多个循环的块中,而不是在每个循环中。

        【讨论】:

        • 对不起,我不太明白你想说什么。 “循环”是什么意思?内核运行?我会说数据输出的频率取决于Emmanuel 想要做什么。请澄清你的答案。此外,标点符号可能会有所帮助... ;-)
        • 我想说的是,如果内核通过多个循环执行并且您需要将某个变量或一组变量写入文件,并且该变量的值在每个循环中更新,你应该把它写在多个循环的块中,而不是在每个循环中,以节省你的代码传输时间(即通过单次传输和写入写入 x(1:1000),而不是传输和写入每个 x(i )),如果没有,这很有用。 of loops 太高了,你需要监控变量的行为而不是等待整个循环完成,这是一个小提示,不是什么大问题
        【解决方案4】:

        在 optix 中,您可以使用缓冲区将所有数据传输回主机,一旦将数据下载回主机内存,您就可以轻松地将数据转换为 csv 或 txt 格式

        【讨论】:

          【解决方案5】:

          我不知道如何打开文件描述符并直接从设备写入;但是,我在 OptiX 中使用了rtPrintf1将程序的输出重定向到文件rtPrintf 将允许您打印变量的内容等,如果您在打印前加上关键字,您可以轻松地为特定项目使用grep。这种策略是调试早期 OptiX 代码的好方法,甚至可以在某种程度上跟踪它正在做的事情。

          【讨论】:

            【解决方案6】:

            不,您无法在设备代码中打开文件;您可以对控制台执行 printf() 以进行调试(在 optix 或 cuda 中,没关系),但无法打开或写入文件。

            可能最简单的解决方案是创建一些可在主机和设备上读写的 CUDA 托管内存 (cudaMallocManaged());将您的变量值写入设备上,然后打开一个文件并将它们转储到主机上。这也适用于 cuda 和 optix。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-11-01
              • 1970-01-01
              • 1970-01-01
              • 2015-09-20
              • 2013-09-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多