15

私はc/c ++ / cudaを1週間未満使用していて、ライブラリに関して利用可能なすべてのオプションに精通していません(私の質問があまりにも奇抜で不可能な場合は申し訳ありません)。これが私の問題です。データを取得して分析し、(1)結果を保存する、(2)結果を破棄する、または(3)データを分解して返送して処理する、の3つのうちの1つを実行するプロセスがあります。

多くの場合、オプション(3)は大量のデータを作成し、使用可能なメモリをすぐに超えてしまうため(サーバーは16ギガ)、それを回避する方法は、作業を送受信するキューサーバー(rabbitmq)をセットアップすることでした。 from(特定のサイズのメモリに達するとキューを交換します)。これは、より高速なNICを備えた小さなサーバーを使用してデータを転送するときに完全に機能しましたが、最近、コードを学習してJavaからc / c ++に変換し、GPUで実行しているため、キューが大きなボトルネックになっています。ボトルネックは明らかにネットワークIOでした(安価なシステムでのプロファイリングは、古いgpuでも同様の高いCPU使用率を示しましたが、新しい高速CPU / GPUはあまり利用されておらず、ネットワーク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との類似性を考慮して、コードを非常に簡単に適応/移行できます。

もう1つのオプションは、既存のSTLコンテナーを使用するが、ディスクでバックアップされたアロケーターを指定することです。すべてのSTLコンテナには、エントリのメモリの保存方法を指定するSTLアロケータのテンプレートパラメータがあります。私の舌の先にあるディスクで裏打ちされた優れたSTLアロケータがありますが、Googleで見つけることができないようです(更新する場合は更新します)。

編集:ロジャーは実際にコメントでこれについてすでに言及していたようです。

于 2012-05-16T18:22:42.050 に答える