0

我正在编写一个 OpenMPI 程序,它为每个处理器创建一个数据库实例,插入一些数据,并在完成后关闭数据库。该程序适用于一个处理器。当创建第二个数据库实例时,启动多个实例会导致分段错误。我的 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()中的第二次调用而失败。CloseDB()错误是分段失败。

任何想法??

4

1 回答 1

1

我认为您需要DBPath为每个实例使用不同的内容,并且您可能希望查看Env并可能在实例之间共享它。

于 2015-08-07T16:28:32.887 回答