私は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で実行します)。