我一直在使用c / c ++ / cuda不到一个星期,并且不熟悉库中可用的所有选项(对不起,如果我的问题太古怪或不可能)。这是我的问题,我有一个过程,它接受数据并分析它然后做三件事中的一件,(1)保存结果,(2)丢弃结果或(3)打破数据并将其发送回处理。
通常选项(3)会创建大量数据并且我很快就超出了我可用的内存(我的服务器是16演出)所以我解决的方法是设置一个队列服务器(rabbitmq)我会发送并从中接收工作(一旦达到一定大小的内存,它就会交换队列)。当我使用具有更快nics的小型服务器来传输数据时,这非常有效,但是最近我一直在学习并将我的代码从Java转换为c / c ++并在GPU上运行它,这使得队列成为一个很大的瓶颈。瓶颈显然是网络io(在廉价系统上进行分析表明cpu使用率很高,旧的gpu类似,但新的更快的cpus / gpus没有得到充分利用,网络IO稳定在300-400 / mbs)。所以我决定尝试完全消除网络并在服务器上本地运行队列服务器,这使得它更快但我怀疑如果我使用不依赖外部网络服务的解决方案,它可能会更快(即使我我在本地运行它们。它可能无效但我想试验。
所以我的问题是,有什么我可以像队列那样使用我可以在读取条目时删除条目但是一旦达到一定大小就将队列交换到磁盘(但保持内存中队列始终满所以我不必等待从磁盘读取)?在了解Cuda时,有许多研究人员对大型数据集运行分析的例子,以及如何保持数据以最快的速度进入系统的任何想法(我想他们不受磁盘/网络的限制,否则更快的gpu的不会真的给他们增加性能的幅度)?
这样的事情是否存在?
P.S。如果它有帮助,到目前为止我已经尝试过rabbitmq(对我的情况来说太慢了),apollo mq(好但是仍然基于网络),reddis(非常喜欢它但不能超过物理内存),玩mmap(),我'我还压缩了我的数据以获得更好的吞吐量。我知道一般的解决方案,但我想知道c / c ++,cuda或我可以使用的库是否有原生的东西(理想情况下,我会在Cuda全局内存中有一个队列交换到交换到的主机内存磁盘所以GPU总是处于全速,但这可能是一厢情愿的想法)。如果您还有其他任何想法可以让我知道,我会喜欢尝试它(如果有帮助,我会在Mac上开发并在Linux上运行)。
答案 0 :(得分:4)
让我提出一些完全不同的建议。
对于有经验的程序员来说,构建自定义解决方案并不会太难,但对于没有经验的甚至是中级程序员来说,生成强大可靠的东西可能是不可能的。
您是否考虑过DBMS?
对于小数据集,它将全部缓存在内存中。随着它的发展,DBMS将拥有一些非常复杂的缓存/分页技术。你可以免费获得分类/优先级,同步/共享等好东西。
一个写得很好的自定义解决方案将比DBMS快得多,但在开发和维护自定义解决方案方面会有巨大的成本。花一点时间优化和调整DBMS,它开始看起来非常快,并且非常强大。
它可能不符合您的需求,但我建议您在拒绝之前仔细查看DBMS。
答案 1 :(得分:4)
标准模板库容器的开源实现是为了解决这个问题而创建的。
STXXL几乎透明地将数据交换到任何标准STL容器的磁盘。它编写得非常好,维护良好,并且很容易适应/迁移您的代码,因为它与STL相似。
另一种选择是使用现有的STL容器,但指定磁盘支持的分配器。所有STL容器都有一个STL分配器的模板参数,它指定如何存储条目的内存。有一个很好的磁盘支持STL分配器,这是我的舌尖,但我似乎无法通过谷歌找到(如果/当我这样做,我会更新此。)
编辑:我看到罗杰实际上已经提到了这个in the comments。