int cfio_finalize() { int ret,flag; cfio_msg_t *msg; ret = MPI_Finalized(&flag); if(flag) { error("***You should not call MPI_Finalize before cfio_Finalized*****\n"); return CFIO_ERROR_FINAL_AFTER_MPI; } if(cfio_map_proc_type(rank) == CFIO_MAP_TYPE_CLIENT) { cfio_send_io_done(&msg, rank); } if(cfio_map_proc_type(rank) == CFIO_MAP_TYPE_SERVER) { cfio_server_final(); }else if(cfio_map_proc_type(rank) == CFIO_MAP_TYPE_CLIENT) { cfio_id_final(); cfio_send_final(); } cfio_map_final(); debug(DEBUG_CFIO, "success return."); return CFIO_ERROR_NONE; }
int cfio_proc_type() { int type; type = cfio_map_proc_type(rank); debug(DEBUG_CFIO, "rank(%d)'s type = %d", rank, type); return type; }
int cfio_msg_get_max_size(int proc_id) { int client_num_of_server, max_msg_size, client_amount, server_id; if (cfio_map_proc_type(proc_id) == CFIO_MAP_TYPE_CLIENT) { server_id = cfio_map_get_server_of_client(proc_id); client_num_of_server = cfio_map_get_client_num_of_server(server_id); } else if (cfio_map_proc_type(proc_id) == CFIO_MAP_TYPE_SERVER) { client_num_of_server = cfio_map_get_client_num_of_server(proc_id); } client_amount = cfio_map_get_client_amount(); max_msg_size = MSG_BUF_SIZE; max_msg_size = min(max_msg_size, RECV_BUF_SIZE / client_num_of_server / 2); max_msg_size = min(max_msg_size, SEND_BUF_SIZE / 2); max_msg_size = max(max_msg_size, SEND_MSG_MIN_SIZE / client_amount); //printf("max_msg_size = %d\n", max_msg_size); return max_msg_size; }
int cfio_init(int x_proc_num, int y_proc_num, int ratio) { int rc, i; int size; int root = 0; int error, ret; int server_proc_num; int best_server_amount; MPI_Group group, client_group, server_group; int *ranks; //set_debug_mask(DEBUG_CFIO | DEBUG_SERVER);// | DEBUG_MSG | DEBUG_SERVER); rc = MPI_Initialized(&i); if( !i ) { error("MPI should be initialized before the cfio\n"); return -1; } MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank(MPI_COMM_WORLD, &rank); //if(rank == 100) //{ // set_debug_mask(DEBUG_MAP); //} client_num = x_proc_num * y_proc_num; server_proc_num = size - client_num; if(server_proc_num < 0) { server_proc_num = 0; } best_server_amount = (int)((double)client_num / ratio); if(best_server_amount <= 0) { best_server_amount = 1; } MPI_Comm_group(MPI_COMM_WORLD, &group); //ranks = malloc(client_num * sizeof(int)); //for(i = 0; i < client_num; i ++) //{ // ranks[i] = i; //} //MPI_Group_incl(group, client_num, ranks, &client_group); //MPI_Comm_create(MPI_COMM_WORLD, client_group, &client_comm); //free(ranks); ranks = malloc(server_proc_num * sizeof(int)); for(i = 0; i < server_proc_num; i ++) { ranks[i] = i + client_num; } MPI_Group_incl(group, server_proc_num, ranks, &server_group); MPI_Comm_create(MPI_COMM_WORLD, server_group, &server_comm); free(ranks); //times_start(); if((ret = cfio_map_init( x_proc_num, y_proc_num, server_proc_num, best_server_amount, MPI_COMM_WORLD, server_comm)) < 0) { error("Map Init Fail."); return ret; } if(cfio_map_proc_type(rank) == CFIO_MAP_TYPE_SERVER) { if((ret = cfio_server_init()) < 0) { error(""); return ret; } if((ret = cfio_server_start()) < 0) { error(""); return ret; } }else if(cfio_map_proc_type(rank) == CFIO_MAP_TYPE_CLIENT) { if((ret = cfio_send_init(CLIENT_BUF_SIZE)) < 0) { error(""); return ret; } if((ret = cfio_id_init(CFIO_ID_INIT_CLIENT)) < 0) { error(""); return ret; } } debug(DEBUG_CFIO, "success return."); return CFIO_ERROR_NONE; }