使用pthread与CUDA -设计问题

Using pthreads with CUDA - design questions

本文关键字:问题 CUDA pthread 使用      更新时间:2023-10-16

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

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

我的问题更像是一个设计问题。我应该使用单独的线程来预先加载数据到GPU库,实际上只有主线程执行调用GPU库,然后将结果数据发送给其他线程被写回磁盘,或者我应该继续,所有的单独的线程每一个做自己的一部分——抓住chucnk的数据,在GPU上执行,并写入磁盘,然后去下一个块的数据?

我使用CUDA为我的GPU库。cuda是否足够聪明,不会同时在GPU上运行两个内核?我想我将不得不做管理手动,以确保两个线程不试图添加更多的数据到GPU比它有空间?

任何关于多线程和CUDA结合使用的好资源都是值得赞赏的。

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

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

据我所知,线程化磁盘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