0

私は、すべてのプロセッサのデータベース インスタンスを作成し、いくつかのデータを挿入し、完了したらデータベースを閉じる 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 セグメンテーションに失敗しました。

何か案が??

4

1 に答える 1

1

インスタンスごとに異なるものが必要だと思います。また、インスタンス間でそれDBPathを見てEnv共有したいと思うかもしれません。

于 2015-08-07T16:28:32.887 に答える