⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ddt_test.c

📁 MPI stands for the Message Passing Interface. Written by the MPI Forum (a large committee comprising
💻 C
📖 第 1 页 / 共 3 页
字号:
    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 + -