Los*_*oul 16 c c++ io cuda message-queue
我一直在使用c/c ++/cuda不到一个星期,不熟悉库中所有可用的选项(对不起,如果我的问题太古怪或不可能).这是我的问题,我有一个过程,它接受数据并分析它然后做三件事中的一件,(1)保存结果,(2)丢弃结果或(3)打破数据并将其发送回处理.
通常选项(3)会创建大量数据,而且我很快就超出了我可用的内存(我的服务器是16演出),所以我解决这个问题的方法就是设置一个队列服务器(rabbitmq)来发送和接收工作from(它在达到一定大小的内存时交换队列).当我使用具有更快nics的小型服务器来传输数据时,这非常有效,但是最近我一直在学习并将我的代码从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上运行).
让我建议一些完全不同的东西。
对于经验丰富的程序员来说,构建自定义解决方案并不会太困难,但对于缺乏经验甚至中级程序员来说,可能不可能生成健壮且可靠的东西。
您考虑过 DBMS 吗?
对于小数据集,它将全部缓存在内存中。随着它的发展,DBMS 将拥有一些非常复杂的缓存/分页技术。您可以免费获得排序/优先级、同步/共享等好东西。
一个真正编写良好的定制解决方案将比 DBMS 快得多,但开发和维护定制解决方案的成本将很高。花一些时间优化和调整 DBMS,它看起来很快并且非常健壮。
它可能不符合您的需求,但我建议您在拒绝 DBMS 之前仔细研究一下它。
| 归档时间: |
|
| 查看次数: |
926 次 |
| 最近记录: |