📄 ddt_test.c
字号:
ompi_datatype_t* upper; disp = (int*)malloc( sizeof(int) * mat_size ); blocklen = (int*)malloc( sizeof(int) * mat_size ); for( i = 0; i < mat_size; i++ ) { disp[i] = i * mat_size; blocklen[i] = i; } ompi_ddt_create_indexed( mat_size, blocklen, disp, ompi_ddt_basicDatatypes[DT_DOUBLE], &upper ); free( disp ); free( blocklen ); return upper;}extern long conversion_elapsed;static int test_upper( unsigned int length ){ double *mat1, *mat2, *inbuf; ompi_datatype_t *pdt; ompi_convertor_t * pConv; char *ptr; int rc; unsigned int i, j, iov_count, split_chunk, total_length; size_t max_data; struct iovec a; TIMER_DATA_TYPE start, end; long total_time; printf( "test upper matrix\n" ); pdt = upper_matrix( length ); /*dt_dump( pdt );*/ mat1 = malloc( length * length * sizeof(double) ); init_random_upper_matrix( length, mat1 ); mat2 = calloc( length * length, sizeof(double) ); total_length = length * (length + 1) * ( sizeof(double) / 2); inbuf = (double*)malloc( total_length ); ptr = (char*)inbuf; /* copy upper matrix in the array simulating the input buffer */ for( i = 0; i < length; i++ ) { uint32_t pos = i * length; for( j = i; j < length; j++, pos++ ) { *inbuf = mat1[pos]; inbuf++; } } inbuf = (double*)ptr; pConv = ompi_convertor_create( remote_arch, 0 ); if( OMPI_SUCCESS != ompi_convertor_prepare_for_recv( pConv, pdt, 1, mat2 ) ) { printf( "Cannot attach the datatype to a convertor\n" ); return OMPI_ERROR; } GET_TIME( start ); split_chunk = (length + 1) * sizeof(double); /* split_chunk = (total_length + 1) * sizeof(double); */ for( i = total_length; i > 0; ) { if( i <= split_chunk ) { /* equal test just to be able to set a breakpoint */ split_chunk = i; } a.iov_base = ptr; a.iov_len = split_chunk; iov_count = 1; max_data = split_chunk; ompi_convertor_unpack( pConv, &a, &iov_count, &max_data ); ptr += max_data; i -= max_data; if( mat2[0] != inbuf[0] ) assert(0); } GET_TIME( end ); total_time = ELAPSED_TIME( start, end ); printf( "complete unpacking in %ld microsec\n", total_time ); /* printf( "conversion done in %ld microsec\n", conversion_elapsed ); */ /* printf( "stack management in %ld microsec\n", total_time - conversion_elapsed ); */ free( inbuf ); rc = check_diag_matrix( length, mat1, mat2 ); free( mat1 ); free( mat2 ); /* test the automatic destruction pf the data */ ompi_ddt_destroy( &pdt ); assert( pdt == NULL ); OBJ_RELEASE( pConv ); return rc;}static ompi_datatype_t* test_matrix_borders( unsigned int size, unsigned int width ){ ompi_datatype_t *pdt, *pdt_line; int disp[2]; int blocklen[2]; disp[0] = 0; blocklen[0] = width; disp[1] = (size - width) * sizeof(double); blocklen[1] = width; ompi_ddt_create_indexed( 2, blocklen, disp, ompi_ddt_basicDatatypes[DT_DOUBLE], &pdt_line ); ompi_ddt_create_contiguous( size, pdt_line, &pdt ); OBJ_RELEASE( pdt_line ); /*assert( pdt_line == NULL );*/ return pdt;}static ompi_datatype_t* test_contiguous( void ){ ompi_datatype_t *pdt, *pdt1, *pdt2; printf( "test contiguous (alignement)\n" ); pdt1 = ompi_ddt_create( -1 ); ompi_ddt_add( pdt1, ompi_ddt_basicDatatypes[DT_DOUBLE], 1, 0, -1 ); if( outputFlags & DUMP_DATA_AFTER_COMMIT ) { ompi_ddt_dump( pdt1 ); } ompi_ddt_add( pdt1, ompi_ddt_basicDatatypes[DT_CHAR], 1, 8, -1 ); if( outputFlags & DUMP_DATA_AFTER_COMMIT ) { ompi_ddt_dump( pdt1 ); } ompi_ddt_create_contiguous( 4, pdt1, &pdt2 ); OBJ_RELEASE( pdt1 ); /*assert( pdt1 == NULL );*/ if( outputFlags & DUMP_DATA_AFTER_COMMIT ) { ompi_ddt_dump( pdt2 ); } ompi_ddt_create_contiguous( 2, pdt2, &pdt ); OBJ_RELEASE( pdt2 ); /*assert( pdt2 == NULL );*/ if( outputFlags & DUMP_DATA_AFTER_COMMIT ) { ompi_ddt_dump( pdt ); } return pdt;}typedef struct __struct_char_double { char c; double d;} char_double_t;static ompi_datatype_t* test_struct_char_double( void ){ char_double_t data; int lengths[] = {1, 1}; MPI_Aint displ[] = {0, 0}; ompi_datatype_t *pdt; ompi_datatype_t* types[] = { &ompi_mpi_char, &ompi_mpi_double }; displ[0] = (char*)&(data.c) - (char*)&(data); displ[1] = (char*)&(data.d) - (char*)&(data); ompi_ddt_create_struct( 2, lengths, displ, types, &pdt ); ompi_ddt_commit( &pdt ); if( outputFlags & DUMP_DATA_AFTER_COMMIT ) { ompi_ddt_dump( pdt ); } return pdt;}static ompi_datatype_t* test_create_twice_two_doubles( void ){ ompi_datatype_t* pdt; ompi_ddt_create_vector( 2, 2, 5, &ompi_mpi_double, &pdt ); ompi_ddt_commit( &pdt ); if( outputFlags & DUMP_DATA_AFTER_COMMIT ) { ompi_ddt_dump( pdt ); } return pdt;}/* Datatype 0x832cf28 size 0 align 1 id 0 length 4 used 0 true_lb 0 true_ub 0 (true_extent 0) lb 0 ub 0 (extent 0) nbElems 0 loops 0 flags 6 (commited contiguous )-cC--------[---][---] contain 13 disp 0x420 (1056) extent 4 --C-----D*-[ C ][INT] MPI_INT count 13 disp 0x478 (1144) extent 4 --C-----D*-[ C ][INT] MPI_INT count 13 disp 0x4d0 (1232) extent 4 --C-----D*-[ C ][INT] MPI_INT count 13 disp 0x528 (1320) extent 4 --C-----D*-[ C ][INT] MPI_INT count 13 disp 0x580 (1408) extent 4 --C-----D*-[ C ][INT] MPI_INT count 13 disp 0x5d8 (1496) extent 4 --C-----D*-[ C ][INT] MPI_INT count 13 disp 0x630 (1584) extent 4 --C-----D*-[ C ][INT] MPI_INT count 12 disp 0x68c (1676) extent 4 --C-----D*-[ C ][INT] MPI_INT count 11 disp 0x6e8 (1768) extent 4 --C-----D*-[ C ][INT] MPI_INT count 10 disp 0x744 (1860) extent 4 --C-----D*-[ C ][INT] MPI_INT count 9 disp 0x7a0 (1952) extent 4 --C-----D*-[ C ][INT] MPI_INT count 8 disp 0x7fc (2044) extent 4 --C-----D*-[ C ][INT] MPI_INT count 7 disp 0x858 (2136) extent 4 --C-----D*-[ C ][INT] MPI_INT count 6 disp 0x8b4 (2228) extent 4 --C-----D*-[ C ][INT] MPI_INT count 5 disp 0x910 (2320) extent 4 --C-----D*-[ C ][INT] MPI_INT count 4 disp 0x96c (2412) extent 4 --C-----D*-[ C ][INT] MPI_INT count 3 disp 0x9c8 (2504) extent 4 --C-----D*-[ C ][INT] MPI_INT count 2 disp 0xa24 (2596) extent 4 --C-----D*-[ C ][INT] MPI_INT count 1 disp 0xa80 (2688) extent 4*/static int blacs_length[] = { 13, 13, 13, 13, 13, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };static int blacs_indices[] = { 1144/4, 1232/4, 1320/4, 1408/4, 1496/4, 1584/4, 1676/4, 1768/4, 1860/4, 1952/4, 2044/4, 2136/4, 2228/4, 2320/4, 2412/4, 2504/4, 2596/4, 2688/4 };static ompi_datatype_t* test_create_blacs_type( void ){ ompi_datatype_t *pdt; ompi_ddt_create_indexed( 18, blacs_length, blacs_indices, &ompi_mpi_int, &pdt ); ompi_ddt_commit( &pdt ); if( outputFlags & DUMP_DATA_AFTER_COMMIT ) { ompi_ddt_dump( pdt ); } return pdt;}static ompi_datatype_t* test_create_blacs_type1( ompi_datatype_t* base_type ){ ompi_datatype_t *pdt; ompi_ddt_create_vector( 7, 1, 3, base_type, &pdt ); ompi_ddt_commit( &pdt ); if( outputFlags & DUMP_DATA_AFTER_COMMIT ) { ompi_ddt_dump( pdt ); } return pdt;}static ompi_datatype_t* test_create_blacs_type2( ompi_datatype_t* base_type ){ ompi_datatype_t *pdt; ompi_ddt_create_vector( 7, 1, 2, base_type, &pdt ); ompi_ddt_commit( &pdt ); if( outputFlags & DUMP_DATA_AFTER_COMMIT ) { ompi_ddt_dump( pdt ); } return pdt;}static ompi_datatype_t* test_struct( void ){ ompi_datatype_t* types[] = { &ompi_mpi_float /* ompi_ddt_basicDatatypes[DT_FLOAT] */, NULL, &ompi_mpi_char /* ompi_ddt_basicDatatypes[DT_CHAR] */ }; int lengths[] = { 2, 1, 3 }; MPI_Aint disp[] = { 0, 16, 26 }; ompi_datatype_t* pdt, *pdt1; printf( "test struct\n" ); pdt1 = ompi_ddt_create( -1 ); ompi_ddt_add( pdt1, ompi_ddt_basicDatatypes[DT_DOUBLE], 1, 0, -1 ); ompi_ddt_add( pdt1, ompi_ddt_basicDatatypes[DT_CHAR], 1, 8, -1 ); if( outputFlags & DUMP_DATA_AFTER_COMMIT ) { ompi_ddt_dump( pdt1 ); } types[1] = pdt1; ompi_ddt_create_struct( 3, lengths, disp, types, &pdt ); OBJ_RELEASE( pdt1 ); /*assert( pdt1 == NULL );*/ if( outputFlags & DUMP_DATA_AFTER_COMMIT ) { ompi_ddt_dump( pdt ); } return pdt;}typedef struct { int i1; int gap; int i2;} sdata_intern;typedef struct { int counter; sdata_intern v[10]; int last;} sstrange;#define SSTRANGE_CNT 10#define USE_RESIZEDstatic ompi_datatype_t* create_strange_dt( void ){ sdata_intern v[2]; MPI_Aint displ[3]; ompi_datatype_t* types[3] = { &ompi_mpi_int }; sstrange t[2]; int pBlock[3] = {1, 10, 1}, dispi[3]; ompi_datatype_t *pdt, *pdt1, *pdt2, *pdtTemp; dispi[0] = (int)((char*)&(v[0].i1) - (char*)&(v[0])); /* 0 */ dispi[1] = (int)(((char*)(&(v[0].i2)) - (char*)&(v[0])) / sizeof(int)); /* 2 */ ompi_ddt_create_indexed_block( 2, 1, dispi, ompi_ddt_basicDatatypes[DT_INT], &pdtTemp );#ifdef USE_RESIZED /* optional */ displ[0] = 0; displ[1] = (char*)&(v[1]) - (char*)&(v[0]); ompi_ddt_create_resized( pdtTemp, displ[0], displ[1], &pdt1 ); OBJ_RELEASE( pdtTemp ); assert( pdtTemp == NULL );#else pdt1 = pdtTemp;#endif /* USE_RESIZED */ types[1] = pdt1; types[2] = &ompi_mpi_int; displ[0] = 0; displ[1] = (long)((char*)&(t[0].v[0]) - (char*)&(t[0])); displ[2] = (long)((char*)&(t[0].last) - (char*)&(t[0])); ompi_ddt_create_struct( 3, pBlock, displ, types, &pdtTemp );#ifdef USE_RESIZED /* optional */ displ[1] = (char*)&(t[1]) - (char*)&(t[0]); ompi_ddt_create_resized( pdtTemp, displ[0], displ[1], &pdt2 ); OBJ_RELEASE( pdtTemp ); assert( pdtTemp == NULL );#else pdt2 = pdtTemp;#endif /* USE_RESIZED */ ompi_ddt_create_contiguous( SSTRANGE_CNT, pdt2, &pdt ); OBJ_RELEASE( pdt1 ); OBJ_RELEASE( pdt2 ); printf( "\nStrange datatype BEFORE COMMIT\n" ); if( outputFlags & DUMP_DATA_AFTER_COMMIT ) { ompi_ddt_dump( pdt ); } ompi_ddt_commit( &pdt ); printf( "\nStrange datatype AFTER COMMIT\n" ); if( outputFlags & DUMP_DATA_AFTER_COMMIT ) { ompi_ddt_dump( pdt ); } return pdt;}static ompi_datatype_t* create_contiguous_type( const ompi_datatype_t* data, int count ){ ompi_datatype_t* contiguous; ompi_ddt_create_contiguous( count, data, &contiguous ); ompi_ddt_commit( &contiguous ); return contiguous;}static ompi_datatype_t* create_vector_type( const ompi_datatype_t* data, int count, int length, int stride ){ ompi_datatype_t* vector; ompi_ddt_create_vector( count, length, stride, data, &vector ); ompi_ddt_commit( &vector ); return vector;}/** * Conversion function. They deal with data-types in 3 ways, always making local copies. * In order to allow performance testings, there are 3 functions: * - one copying directly from one memory location to another one using the * data-type copy function. * - one which use a 2 convertors created with the same data-type * - and one using 2 convertors created from different data-types. * */static int local_copy_ddt_count( ompi_datatype_t* pdt, int count ){ MPI_Aint extent; void *pdst, *psrc; TIMER_DATA_TYPE start, end; long total_time; ompi_ddt_type_extent( pdt, &extent ); pdst = malloc( extent * count ); psrc = malloc( extent * count ); { int i; for( i = 0; i < (count * extent); i++ ) ((char*)psrc)[i] = i % 128 + 32; } memset( pdst, 0, count * extent ); cache_trash(); /* make sure the cache is useless */ GET_TIME( start ); if( OMPI_SUCCESS != ompi_ddt_copy_content_same_ddt( pdt, count, pdst, psrc ) ) { printf( "Unable to copy the datatype in the function local_copy_ddt_count." " Is the datatype committed ?\n" ); } GET_TIME( end ); total_time = ELAPSED_TIME( start, end ); printf( "direct local copy in %ld microsec\n", total_time ); free( pdst );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -