Commit 128583d4 authored by lykos98's avatar lykos98
Browse files

added foreign nodes identification

parent 7b744609
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -10,6 +10,8 @@ void get_context(global_context_t* ctx)
	ctx -> local_data = NULL;
	ctx -> lb_box 	  = NULL;
	ctx -> ub_box 	  = NULL;
    ctx -> rank_n_points  = (int*)malloc(ctx -> world_size * sizeof(int));
    ctx -> rank_idx_start = (int*)malloc(ctx -> world_size * sizeof(int));
}

void free_context(global_context_t* ctx)
@@ -31,7 +33,8 @@ void free_context(global_context_t* ctx)
		free(ctx -> lb_box);
		ctx -> lb_box = NULL;	
	}

    free(ctx -> rank_n_points);
    free(ctx -> rank_idx_start);
}

void free_pointset(pointset_t* ps)
+9 −7
Original line number Diff line number Diff line
@@ -92,16 +92,18 @@

struct global_context_t 
{
    int world_size; 
    int mpi_rank;
    int __processor_name_len;
	float_t* local_data;
	float_t* lb_box;
	float_t* ub_box;
    size_t n_points;
    size_t idx_start;
    size_t local_n_points;
    uint32_t dims;
	float_t* local_data;
	float_t* lb_box;
	float_t* ub_box;
	int world_size; 
	int mpi_rank;
	int __processor_name_len;
    int* rank_idx_start;
    int* rank_n_points;
	char processor_mame[MPI_MAX_PROCESSOR_NAME];
	MPI_Comm mpi_communicator;
};
+115 −14
Original line number Diff line number Diff line
@@ -1152,7 +1152,12 @@ void exchange_points(global_context_t* ctx, top_kdtree_t* tree)
    {
        ctx -> idx_start += ppp[i];
    }
    //DB_PRINT("rank %d start %lu\n", ctx -> mpi_rank, ctx -> idx_start);

    /* find slices of indices */
    for(int i = 0; i < ctx -> world_size; ++i) ctx -> rank_n_points[i] = ppp[i]; 

    ctx -> rank_idx_start[0] = 0;
    for(int i = 1; i < ctx -> world_size; ++i) ctx -> rank_idx_start[i] = ppp[i - 1] + ctx -> rank_idx_start[i - 1]; 

    /* free prv pointer */
    free(ppp);
@@ -1167,6 +1172,8 @@ void exchange_points(global_context_t* ctx, top_kdtree_t* tree)
        if(o != ctx -> mpi_rank) DB_PRINT("rank %d got an error\n",ctx -> mpi_rank);
    }



    free(points_owners);
    free(points_per_proc);
    free(partition_offset);
@@ -1718,20 +1725,12 @@ void mpi_ngbh_search(global_context_t* ctx, datapoint_info_t* dp_info, top_kdtre

    MPI_Barrier(ctx -> mpi_communicator);

    


    
    for(int i = 0; i < ctx -> world_size; ++i)
    {
        if(data_to_send_per_proc[i])  free(data_to_send_per_proc[i]);
        if(local_idx_of_the_point[i]) free(local_idx_of_the_point[i]);
    }

    for(int i = 0; i < ctx -> local_n_points; ++i)
    {
        free(dp_info[i].ngbh.data);
    }

    free(data_to_send_per_proc);
    free(local_idx_of_the_point);
@@ -1826,11 +1825,105 @@ void ordered_data_to_file(global_context_t* ctx)

    }
    MPI_Barrier(ctx -> mpi_communicator);
    gg
}

static inline int foreign_owner(global_context_t* ctx, idx_t idx)
{
    int owner;
    if( idx >= ctx -> idx_start && idx < ctx -> idx_start + ctx -> local_n_points) 
    {
        return ctx -> mpi_rank;
    }

    for(int i = 0; i < ctx -> world_size; ++i)
    {
        owner = i;    
        if( idx >= ctx -> rank_idx_start[i] && idx < ctx -> rank_idx_start[i] + ctx -> rank_n_points[i]) break;
    }
    return owner;
}

static inline void push_on_foreign_idx_list(idx_t element, int owner, int* counts, int* capacities, idx_t** lists)
{

    if(capacities[owner] == counts[owner])
    {
        int new_cap = capacities[owner] * 1.1;
        lists[owner] = (idx_t*)realloc(lists[owner], new_cap * sizeof(idx_t));
        capacities[owner] = new_cap;
    }
   

    /* find the plausible place */
    int idx_to_insert = counts[owner]; 
    
    int flag = 1;
    /* check if point is already inserted */
    for(int i = 0; i < idx_to_insert; ++i)
    {
        flag = flag && lists[owner][i] != element; 
    }

    /* if this is the case insert it */ 
    
    if(flag)
    {
        counts[owner]++;
        lists[owner][idx_to_insert] = element;
    }

}

void find_foreign_nodes(global_context_t* ctx, datapoint_info_t* dp)
{
    int k = dp[0].ngbh.count;
    
    idx_t** array_indexes_to_request = (idx_t**)malloc(ctx -> world_size * sizeof(idx_t*));
    int*    count_to_request         = (int*)malloc(ctx -> world_size * sizeof(int));
    int*    capacities               = (int*)malloc(ctx -> world_size * sizeof(int));

    for(int i = 0; i < ctx -> world_size; ++i)
    {
        array_indexes_to_request[i] = (idx_t*)malloc(100 * sizeof(idx_t));
        capacities[i] = 100;
        count_to_request[i] = 0;
    }
    
    #pragma omp parallel for
    for(uint32_t i = 0; i < ctx -> local_n_points; ++i)
    {
        for(int j = 0; j < k; ++j)
        {
            idx_t element = dp[i].ngbh.data[j].array_idx;        
            int owner = foreign_owner(ctx, element);
            //DB_PRINT("%lu %d\n", element, owner);
            
            if(owner != ctx -> mpi_rank)
            {
                //DB_PRINT("Hehe");
                #pragma omp critical
                {
                    push_on_foreign_idx_list(element, owner, count_to_request, capacities, array_indexes_to_request);
                }
            }
        }
    }
    
    DB_PRINT("[RANK %d elements to request]", ctx -> mpi_rank);
    for(int i = 0; i < ctx -> world_size; ++i)
    {
        DB_PRINT("%d\t", count_to_request[i]);
    }
    DB_PRINT("\n");


    
    for(int i = 0; i < ctx -> world_size; ++i) free(array_indexes_to_request[i]);
    free(array_indexes_to_request);
    free(count_to_request);
    free(capacities);
}

void simulate_master_read_and_scatter(int dims, size_t n, global_context_t *ctx) 
{
    float_t *data;
@@ -1846,10 +1939,10 @@ void simulate_master_read_and_scatter(int dims, size_t n, global_context_t *ctx)
    
        // 190M points
        // std_g2980844_091_0000
        data = read_data_file(ctx,"../norm_data/std_g2980844_091_0000",MY_TRUE);
        // data = read_data_file(ctx,"../norm_data/std_g2980844_091_0000",MY_TRUE);
        
        /* 1M points ca.*/
        // data = read_data_file(ctx,"../norm_data/std_LR_091_0001",MY_TRUE);
        data = read_data_file(ctx,"../norm_data/std_LR_091_0001",MY_TRUE);

        /* 8M points */
        
@@ -1865,7 +1958,7 @@ void simulate_master_read_and_scatter(int dims, size_t n, global_context_t *ctx)

        //ctx -> n_points = 48*5*2000;
        ctx->n_points = ctx->n_points / ctx->dims;
        ctx->n_points = (ctx->n_points * 6) / 10;
        ctx->n_points = (ctx->n_points * 5) / 10;
        // ctx -> n_points = ctx -> world_size * 1000;

        //ctx -> n_points = 10000000 * ctx -> world_size;
@@ -1968,11 +2061,18 @@ void simulate_master_read_and_scatter(int dims, size_t n, global_context_t *ctx)
    elapsed_time = TIME_STOP;
    LOG_WRITE("Total time for all knn search", elapsed_time)

    find_foreign_nodes(ctx, dp_info);


    #if defined (WRITE_NGBH)
        ordered_data_to_file(ctx);
    #endif

    for(int i = 0; i < ctx -> local_n_points; ++i)
    {
        free(dp_info[i].ngbh.data);
    }
    

    top_tree_free(ctx, &tree);
    kdtree_v2_free(&local_tree);
@@ -1986,4 +2086,5 @@ void simulate_master_read_and_scatter(int dims, size_t n, global_context_t *ctx)
    original_ps.data = NULL;
    free_pointset(&original_ps);
    free(global_bin_counts_int);

}
+1 −1
Original line number Diff line number Diff line
@@ -83,8 +83,8 @@ typedef struct top_kdtree_t


typedef struct datapoint_info_t {
  heap ngbh;
    idx_t array_idx;
  heap ngbh;
  float_t g;
  float_t log_rho;
  float_t log_rho_c;