我使用 c/c++/cuda 不到一周,并且不熟悉库方面的所有可用选项(抱歉,如果我的问题太古怪或不可能)。这是我的问题,我有一个过程,它获取数据并对其进行分析,然后执行 3 件事中的 1 件事,(1) 保存结果,(2) 丢弃结果或 (3) 分解数据并将其发送回处理。
通常选项(3)会创建大量数据,我很快就会超过我可用的内存(我的服务器是 16 gigs)所以我解决这个问题的方法是设置一个队列服务器(rabbitmq),我将发送和接收工作from(一旦达到一定大小的内存,它就会交换队列)。当我使用具有更快 nic 的小型服务器来传输数据时,这非常有效,但最近我一直在学习并将我的代码从 Java 转换为 c/c++ 并在 GPU 上运行,这使得队列成为一个很大的瓶颈。瓶颈显然是网络 io(廉价系统上的分析显示 cpu 使用率很高,并且在旧 gpu 上类似,但新的更快的 cpus/gpus 没有得到充分利用,网络 IO 稳定在 300-400/mbs)。所以我决定尝试完全消除网络并在服务器上本地运行队列服务器,这使它更快,但我怀疑如果我使用不依赖外部网络服务的解决方案可能会更快(即使我我在本地运行它们)。它可能行不通,但我想尝试一下。
所以我的问题是,有什么我可以像队列一样使用的东西,我可以在读取条目时删除它们,但也可以在队列达到一定大小时将其交换到磁盘(但保持内存中的队列总是满的,所以我不不必等待从磁盘读取)?在学习 Cuda 时,有很多研究人员对大型数据集进行分析的例子,关于他们如何让数据以最快的速度进入系统以供系统处理的任何想法(我想他们不受磁盘/网络的约束,否则更快的 gpu真的不会让他们的性能大幅提升)?
这样的事情存在吗?
ps 如果有帮助,到目前为止,我已经尝试过 rabbitmq(对我的情况来说太慢了),apollo mq(很好但仍然基于网络),reddis(真的很喜欢它但不能超过物理内存),玩 mmap(),我'还压缩了我的数据以获得更好的吞吐量。我知道一般的解决方案,但我想知道是否有 c/c++、cuda 或我可以使用的库(理想情况下,我会在 Cuda 全局内存中有一个队列,该队列交换到交换到磁盘的主机内存,所以GPU 将始终全速运行,但这可能是一厢情愿的想法)。如果您还有其他想法,请告诉我,我会很乐意尝试(如果有帮助,我会在 Mac 上开发并在 linux 上运行)。