0
私がやりたいことは、いくつかの文字列に対して基本的なMapReduce操作を実行することです。私がしたい:MPIで文字列の配列を散布する方法C++
- は、(同じように)プロセスで
- を私のすべてのプロセスに文字列のリストを配布:カスタムクラス(例えば
WordWithFrequency
)のオブジェクトに受け取った文字列の地図、 - 収集します追加の操作のためにそれらをプロセスに再び送ります。
これは簡単な作業であるはずですが、正しく実行する方法が見つかりませんでした。ここに私の壊れたコードは次のとおりです。
#include <boost/mpi.hpp>
...
int main(int argc, char *argv[]) {
// Initialize the MPI environment.
mpi::environment env(argc, argv);
mpi::communicator world;
vector<string> words = { "foo", "bar", "baz", "..." };
const int wordCount = words.size();
const int wordsPerProcess = wordCount/world.size();
vector<vector<string> > wordsByProcess(world.size(), vector<string>());
for (int j = 0; j < world.size(); ++j) {
for (int k = 0, wordIndex = j * wordsPerProcess + k;
k < wordsPerProcess && wordIndex < wordCount; ++k, ++wordIndex) {
wordsByProcess[j].push_back(words[wordIndex]);
}
}
vector<string> subWords;
mpi::scatter(world, wordsByProcess, subWords, 0);
// subWords is equal to wordsByProcess[world.rank()] here in every process.
散布:それはBoost.MPIと本当に簡単な作業です
Process 0 got words:
�R
Process 1 got words:
'new []'よりも 'std :: vector'のようなものを試してみてください。メモリ管理の問題が大幅に軽減されるので、あなたの人生は大幅に*簡単になります。 – tadman
@tadman私は(実際、私は確信しています)問題は配列ではなく、 'MPI_Scatter'であると思います。私はここで何か完全に間違っていますが、私はインターネット上で文字列散乱の一例を見つけることができませんでした。 ps。 'std :: vector'は役に立たなかった。 – smddzcy
この特殊なケースでは、すべての問題を魔法のように修正するつもりはありませんが、メモリリークを追跡する日数を無駄にしないため、長期的には役立ちます。 – tadman