15

我使用 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 上运行)。

4

2 回答 2

4

让我建议一些完全不同的东西。

对于有经验的程序员来说,构建自定义解决方案不会太难,但对于没有经验甚至是中级程序员来说,可能不可能产生健壮和可靠的东西。

你考虑过DBMS吗?

对于小型数据集,它将全部缓存在内存中。随着它的发展,DBMS 将拥有一些非常复杂的缓存/分页技术。您可以免费获得排序/优先排序、同步/共享等好东西。

一个写得很好的自定义解决方案将比 DBMS 快得多,但在开发和维护自定义解决方案方面会产生巨大的成本。花一些时间优化和调整 DBMS,它开始看起来非常快并且非常健壮。

它可能不符合您的需求,但我建议您在拒绝之前仔细研究一下 DBMS。

于 2012-05-16T18:17:04.983 回答
4

标准模板库容器的开源实现就是为了解决这个问题而创建的。

STXXL几乎透明地将数据交换到任何标准 STL 容器的磁盘。它写得很好,维护得很好,并且很容易适应/迁移你的代码,因为它与 STL 相似。

另一种选择是使用现有的 STL 容器,但指定一个磁盘支持的分配器。所有的 STL 容器都有一个 STL 分配器的模板参数,它指定如何存储条目的内存。有一个很好的磁盘支持的 STL 分配器就在我的舌尖上,但我似乎无法通过 Google 找到(如果/当我这样做时,我会更新它)。

编辑:我看到罗杰实际上已经在评论中提到了这一点。

于 2012-05-16T18:22:42.050 回答