私は、すべてのプロセッサのデータベース インスタンスを作成し、いくつかのデータを挿入し、完了したらデータベースを閉じる OpenMPI プログラムを作成しています。このプログラムは、1 つのプロセッサで問題なく動作します。複数のインスタンスを開始すると、2 番目のデータベース インスタンスが作成されるときにセグメンテーション エラーが発生します。私の MPI プログラムは次のようになります。
#include <mpi.h>
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "rocksdb_c.h"
int main (int argc, char *argv[]) {
MPI_Init(&argc, &argv);
int rank, size;
time_t t;
MPI_Comm_rank (MPI_COMM_WORLD, &rank); /* get current process id */
MPI_Comm_size (MPI_COMM_WORLD, &size); /* get number of processes */
srand(rank * 1766+8765);
int key = 0, value = 0;
rocksdb_env_t* env= CreateEnvironment(size);
rocksdb_options_t* options= InstantiateOptions(env);
rocksdb_t *db=CreateDb(options);
rocksdb_writeoptions_t* writeoptions=WriteOptions();
int i;
for ( i = 1; i < 10000; ++i) {
value = rand()%10000;
//key = rand()%10000;
key = i*size +rank;
Put(ToCharArray(key),ToCharArray(value), db, writeoptions);
printf("i=%d, key=%d, value=%d, rank=%d,size=%d\n",i, key,value,rank,size);
}
CloseDb(db);
MPI_Barrier(MPI_COMM_WORLD);
MPI_Finalize();
return 0;
}
私rocksdb_c.h
はこのように見えます:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <math.h>
#include "rocksdb/c.h"
#include <unistd.h> // sysconf() - get CPU count
const char DBPath[]="/tm/rocksdb_simple_example";
const char DBBackupPath[] = "/tmp/rocksdb_simple_example_backup";
rocksdb_env_t* CreateEnvironment(int processes){
rocksdb_env_t* env=rocksdb_create_default_env();
rocksdb_env_set_background_threads(env,processes);
rocksdb_env_set_high_priority_background_threads(env, processes);
return env;
}
rocksdb_t* CreateDb(rocksdb_options_t* options){
rocksdb_t *db;
char *err=NULL;
db = rocksdb_open(options, DBPath, &err); assert(!err);
return db; }
void CloseDb(rocksdb_t *db){
rocksdb_close(db);
}
rocksdb_options_t* InstantiateOptions(int processes){
rocksdb_options_t* options= rocksdb_options_create();
rocksdb_options_set_create_if_missing(options, 1);
rocksdb_options_set_env(options,env);
return options;
}
rocksdb_writeoptions_t* WriteOptions(){
return rocksdb_writeoptions_create();
}
void Put(char* key, char* value, rocksdb_t* db, rocksdb_writeoptions_t* writeoptions){
char *err=NULL;
printf("before\n");
rocksdb_put(db, writeoptions, key, strlen(key), value, strlen(value) , &err);
}
rocksdb_open()
プログラムは、関数内のの 2 回目の呼び出しで失敗しCloseDB()
ます。エラー ist セグメンテーションに失敗しました。
何か案が??