#include #include #include #define TOTALELEMS 147 int main(int argc,char *argv[]) { gaspi_rank_t rank, size; gaspi_proc_init(GASPI_BLOCK); gaspi_proc_rank(&rank); gaspi_proc_num(&size); gaspi_segment_id_t seg_id_a = 0, seg_id_b = 1; gaspi_pointer_t seg_ptr_array, seg_ptr_value; gaspi_size_t seg_length; gaspi_offset_t l_p = 0, r_p = 0; int i, n, n_part, s = 0, shift = 0; int *a, *b; n = TOTALELEMS; // Výpočet dlžky segmentov if( n%size == 0 ) n_part = n/size; else { shift = size-n%size; n_part = (n+shift)/size; s = 1; if ( rank == size-1 ) { n_part = n-n_part*(size-1); shift = 0; } } // Alokácia GASPI segmentov seg_length = sizeof (int); gaspi_segment_create ( seg_id_a, n_part*seg_length, GASPI_GROUP_ALL,GASPI_BLOCK, GASPI_MEM_INITIALIZED ); gaspi_segment_create ( seg_id_b, n_part*seg_length, GASPI_GROUP_ALL,GASPI_BLOCK, GASPI_MEM_INITIALIZED ); // Získanie lokálnych ukazovateľov gaspi_segment_ptr ( seg_id_a, & seg_ptr_array ); a = (int *) seg_ptr_array ; gaspi_segment_ptr ( seg_id_b, & seg_ptr_array ); b = (int *) seg_ptr_array ; // Inicializácia údajov for (i = 0; i < n_part; i++) { a[i] = rank*(n+s*size-n%size)/size + i; b[i] = a[i]; } // Invertovanie lokálnych údajov for (i = 0; i < n_part; i++) { a[i] = b[n_part-i-1]; } // Invertovanie globálnych údajov if( shift > 0 ) { l_p = 0; r_p = (n_part-shift)*sizeof(int); gaspi_write( seg_id_a, l_p, size-2-rank, seg_id_b, r_p, shift*sizeof(int), 0, GASPI_BLOCK); } l_p = shift*sizeof(int); r_p = 0; gaspi_write( seg_id_a, l_p, size-1-rank, seg_id_b, r_p, (n_part-shift)*sizeof(int), 0, GASPI_BLOCK); // Synchronizuj všetky procesy // gaspi_barrier ( GASPI_GROUP_ALL, GASPI_BLOCK ); // Ukončenie GASPI gaspi_proc_term ( GASPI_BLOCK ); return 0; }