【问题标题】:Using pthreads with CUDA - design questions在 CUDA 中使用 pthreads - 设计问题
【发布时间】:2011-07-12 23:27:26
【问题描述】:

我正在编写一些需要一些磁盘 I/O 的代码,并调用我编写的库来执行一些计算和 GPU 工作,然后使用更多的磁盘 I/O 将结果写回文件。

我想将其创建为多线程代码,因为文件非常大。我希望能够读取文件的一部分,将其发送到 GPU 库,然后将一部分写回文件。所涉及的磁盘 I/O 相当大(如 10GB),而且在 GPU 上的计算速度相当快。

我的问题更像是一个设计问题。我是否应该使用单独的线程来预加载进入 GPU 库的数据,并且只有主线程实际执行对 GPU 库的调用,然后将结果数据发送到其他线程以写回磁盘,或者我是否应该继续让所有单独的线程各司其职——抓取一大块数据,在 GPU 上执行,然后写入磁盘,然后再去获取下一块数据?

我将 CUDA 用于我的 GPU 库。 cuda 是否足够聪明,不会尝试同时在 GPU 上运行两个内核?我想我将不得不手动进行管理,以确保两个线程不会尝试向 GPU 添加超过其空间的数据?

感谢任何关于多线程和 CUDA 组合使用的好的资源。

【问题讨论】:

  • 有趣的问题。我知道虽然一些 CUDA 操作是异步的,但对内核的调用总是会等待完成,然后再继续执行代码。但是我只使用过单线程 CUDA。我猜每个线程都需要它自己的 CUDA 上下文,从而允许每个线程使用 GPU,但不一定共享任何数据。在nVidia forums 有一些关于此的问题。
  • “cuda 是否足够聪明,不会尝试同时在 GPU 上运行两个内核?”在计算能力 > 2.0 的卡上,可以同时启动多个内核,但我认为它们必须在同一个流中。如果您要使用多线程实现,您可能必须从两个线程读取数据,但只从其中一个线程启动内核。
  • 不不不,当你启动连续的内核时,它们只有在不同的流上才能并发执行,如果它们在同一个流上,它们将按顺序执行。关于多个主机线程的行为我不确定,因为我从未使用过它,但我认为 CUDA 编程指南讨论了使用多个上下文以及它是如何工作的。
  • @Derek 您能否更新一下您最终使用了什么以及效果如何?我在这里遇到了类似的情况,希望您能在这里帮助我。

标签: c++ multithreading cuda pthreads gpu


【解决方案1】:

线程对磁盘 I/O 没有帮助。通常人们倾向于通过创建大量线程来解决阻塞问题。事实上,这只会让事情变得更糟。您需要做的是使用asynchronous I/O 而不是在写入(和读取)时阻塞。您可以为此使用一些通用解决方案,例如 libeventAsio,或者使用您平台上可用的较低级别的 API。在 Linux 上,AIO 似乎是最好的文件,但我还没有尝试过。希望对您有所帮助。

【讨论】:

    【解决方案2】:

    我在研究工作中遇到过大文件的这种情况。

    据我所知,线程化磁盘 I/O 工作并没有太大收获,因为 与 GPU I/O 相比非常慢。

    我使用的策略是从磁盘同步读取并在 GPU 上加载数据和异步执行。

    类似:

    read from disk
    loop:
     async_load_to_gpu
     async_execute
     push_event
     read from disk
     check event complete or read more data from disk
    

    【讨论】:

      猜你喜欢
      • 2012-10-24
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多