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

📄 ddt_test.c

📁 MPI stands for the Message Passing Interface. Written by the MPI Forum (a large committee comprising
💻 C
📖 第 1 页 / 共 3 页
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//* * Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana *                         University Research and Technology *                         Corporation.  All rights reserved. * Copyright (c) 2004-2006 The University of Tennessee and The University *                         of Tennessee Research Foundation.  All rights *                         reserved. * Copyright (c) 2004-2006 High Performance Computing Center Stuttgart,  *                         University of Stuttgart.  All rights reserved. * Copyright (c) 2004-2006 The Regents of the University of California. *                         All rights reserved. * Copyright (c) 2006      Sun Microsystems Inc. All rights reserved. * $COPYRIGHT$ *  * Additional copyrights may follow *  * $HEADER$ */#include "ompi_config.h"#include "ompi/datatype/datatype.h"#include "ompi/datatype/datatype_internal.h"#include "ompi/datatype/convertor.h"#include <time.h>#include <stdlib.h>#ifdef HAVE_SYS_TIME_H#include <sys/time.h>#endif#include <time.h>/* Compile with:mpicc -DHAVE_CONFIG_H -I. -I../../include -I../../../ompi-trunk/include  -I../.. -I../../include -I../../../ompi-trunk/opal -I../../../ompi-trunk/orte -I../../../ompi-trunk/ompi -g ddt_test.c -o ddt_test*/#define TIMER_DATA_TYPE struct timeval#define GET_TIME(TV)   gettimeofday( &(TV), NULL )#define ELAPSED_TIME(TSTART, TEND)  (((TEND).tv_sec - (TSTART).tv_sec) * 1000000 + ((TEND).tv_usec - (TSTART).tv_usec))#define DUMP_DATA_AFTER_COMMIT 0x00000001#define CHECK_PACK_UNPACK      0x00000002static uint32_t outputFlags = CHECK_PACK_UNPACK;uint32_t remote_arch;void print_double_mat( unsigned int N, double* mat );ompi_datatype_t* lower_matrix( unsigned int mat_size );/** * Cache cleanup. */#define CACHE_SIZE (4*1024*1024)static void cache_trash( void ){    char* buffer;    buffer = (char*)malloc( sizeof(char) * CACHE_SIZE );    memset( buffer, 1, CACHE_SIZE );    memset( buffer, 0xff, CACHE_SIZE );    free( buffer );}/** * Data-type functions. */static ompi_datatype_t* create_inversed_vector( ompi_datatype_t* type, int length ){   ompi_datatype_t* type1;   ompi_ddt_create_vector( length, 1, 2, type, &type1 );   ompi_ddt_commit( &type1 );   return type1;}static int mpich_typeub( void ){   int errs = 0;   MPI_Aint extent, lb, extent1, extent2, extent3;   MPI_Aint displ[2];   int blens[2];   ompi_datatype_t *type1, *type2, *type3, *types[2];   ompi_ddt_create_vector( 2, 1, 4, ompi_ddt_basicDatatypes[DT_INT], &type1 );   ompi_ddt_commit( &type1 );   ompi_ddt_get_extent( type1, &lb, &extent );   extent1 = 5 * sizeof(int);   if (extent != extent1) {      printf("EXTENT 1 %ld != %ld\n", (long)extent, (long)extent1);      errs++;      printf("extent(type1)=%ld\n",(long)extent);   }   blens[0] = 1;   blens[1] = 1;   displ[0] = 0;   displ[1] = sizeof(int)*4;   types[0] = type1;   types[1] = &ompi_mpi_ub;  /*ompi_ddt_basicDatatypes[DT_UB];*/   extent2  = displ[1];   /*    using MPI_UB and Type_struct, monkey with the extent, making it 16    */   ompi_ddt_create_struct( 2, blens, displ, types, &type2 );   ompi_ddt_commit( &type2 );   ompi_ddt_get_extent( type2, &lb, &extent );   if (extent != extent2) {      printf("EXTENT 2 %ld != %ld\n", (long)extent, (long)extent2);      errs++;      printf("extent(type2)=%ld\n",(long)extent);   }   /*    monkey with the extent again, making it 4    *     ===> MPICH gives 4    *     ===> MPIF gives 16, the old extent    */   displ[1] = sizeof(int);   types[0] = type2;   types[1] = &ompi_mpi_ub;  /*ompi_ddt_basicDatatypes[DT_UB];*/   extent3  = extent2;   ompi_ddt_create_struct( 2, blens, displ, types, &type3 );   ompi_ddt_commit( &type3 );   ompi_ddt_get_extent( type3, &lb, &extent );   if (extent != extent3) {      printf("EXTENT 3 %ld != %ld\n", (long)extent, (long)extent3);      errs++;      printf("extent(type3)=%ld\n",(long)extent);   }   OBJ_RELEASE( type1 ); /*assert( type1 == NULL );*/   OBJ_RELEASE( type2 ); /*assert( type2 == NULL );*/   OBJ_RELEASE( type3 ); assert( type3 == NULL );   return errs;}static int mpich_typeub2( void ){   int blocklen[3], err = 0;   size_t sz1, sz2, sz3;   MPI_Aint disp[3], lb, ub, ex1, ex2, ex3;   ompi_datatype_t *types[3], *dt1, *dt2, *dt3;   blocklen[0] = 1;   blocklen[1] = 1;   blocklen[2] = 1;   disp[0] = -3;   disp[1] = 0;   disp[2] = 6;   types[0] = &ompi_mpi_lb;  /* ompi_ddt_basicDatatypes[DT_LB]; */   types[1] = &ompi_mpi_int;  /* ompi_ddt_basicDatatypes[DT_INT]; */   types[2] = &ompi_mpi_ub;  /* ompi_ddt_basicDatatypes[DT_UB]; */   ompi_ddt_create_struct(3,blocklen,disp, types,&dt1);   ompi_ddt_commit(&dt1);   ompi_ddt_type_lb(dt1, &lb);          ompi_ddt_type_ub(dt1, &ub);   ompi_ddt_type_extent(dt1,&ex1);      ompi_ddt_type_size(dt1,&sz1);   /* Values should be lb = -3, ub = 6 extent 9; size depends on implementation */   if (lb != -3 || ub != 6 || ex1 != 9) {      printf("Example 3.26 type1 lb %d ub %d extent %d size %d\n", (int)lb, (int)ub, (int)ex1, (int)sz1);      err++;   }   else      printf("Example 3.26 type1 correct\n" );   ompi_ddt_create_contiguous(2,dt1,&dt2);   ompi_ddt_type_lb(dt2, &lb);          ompi_ddt_type_ub(dt2, &ub);   ompi_ddt_type_extent(dt2,&ex2);      ompi_ddt_type_size(dt2,&sz2);   /* Values should be lb = -3, ub = 15, extent = 18, size depends on implementation */   if (lb != -3 || ub != 15 || ex2 != 18) {      printf("Example 3.26 type2 lb %d ub %d extent %d size %d\n", (int)-3, (int)15, (int)18, 8);      printf("Example 3.26 type2 lb %d ub %d extent %d size %d\n", (int)lb, (int)ub, (int)ex2, (int)sz2);      err++;   }   else      printf("Example 3.26 type1 correct\n" );   OBJ_RELEASE( dt2 ); assert( dt2 == NULL );   ompi_ddt_create_contiguous(2,dt1,&dt2);   ompi_ddt_type_lb(dt2, &lb);          ompi_ddt_type_ub(dt2, &ub);   ompi_ddt_type_extent(dt2,&ex2);      ompi_ddt_type_size(dt2,&sz2);   /* Values should be lb = -3, ub = 15, extent = 18, size depends on implementation */   if (lb != -3 || ub != 15 || ex2 != 18) {      printf("Example 3.26 type2 lb %d ub %d extent %d size %d\n", (int)-3, (int)15, (int)18, 8);      printf("Example 3.26 type2 lb %d ub %d extent %d size %d\n", (int)lb, (int)ub, (int)ex2, (int)sz2);      err++;   }   else      printf( "Example 3.26 type2 correct\n" );   types[0]=dt1;               types[1]=dt1;   blocklen[0]=1;              blocklen[1]=1;   disp[0]=0;                  disp[1]=ex1;   ompi_ddt_create_struct(2, blocklen, disp, types, &dt3);   ompi_ddt_commit(&dt3);   ompi_ddt_type_lb(dt3, &lb);          ompi_ddt_type_ub(dt3, &ub);   ompi_ddt_type_extent(dt3,&ex3);      ompi_ddt_type_size(dt3,&sz3);   /* Another way to express type2 */   if (lb != -3 || ub != 15 || ex3 != 18) {      printf("type3 lb %d ub %d extent %d size %d\n", (int)-3, (int)15, (int)18, 8);      printf("type3 lb %d ub %d extent %d size %d\n", (int)lb, (int)ub, (int)ex3, (int)sz2);      err++;   }   else      printf( "type3 correct\n" );   OBJ_RELEASE( dt1 ); /*assert( dt1 == NULL );*/   OBJ_RELEASE( dt2 ); /*assert( dt2 == NULL );*/   OBJ_RELEASE( dt3 ); assert( dt3 == NULL );   return err;}static int mpich_typeub3( void ){   int blocklen[2], err = 0, idisp[3];   size_t sz;   MPI_Aint disp[3], lb, ub, ex;   ompi_datatype_t *types[3], *dt1, *dt2, *dt3, *dt4, *dt5;   /* Create a datatype with explicit LB and UB */   blocklen[0] = 1;   blocklen[1] = 1;   blocklen[2] = 1;   disp[0] = -3;   disp[1] = 0;    disp[2] = 6;   types[0] = &ompi_mpi_lb;  /* ompi_ddt_basicDatatypes[DT_LB]; */   types[1] = &ompi_mpi_int;  /* ompi_ddt_basicDatatypes[DT_INT]; */   types[2] = &ompi_mpi_ub;  /* ompi_ddt_basicDatatypes[DT_UB]; */      /* Generate samples for contiguous, hindexed, hvector, indexed, and vector (struct and contiguous tested in typeub2) */                                                                                                                            ompi_ddt_create_struct(3,blocklen,disp, types,&dt1);   ompi_ddt_commit(&dt1);   /* This type is the same as in typeub2, and is tested there */   types[0]=dt1;               types[1]=dt1;   blocklen[0]=1;              blocklen[1]=1;   disp[0]=-4;                 disp[1]=7;   idisp[0]=-4;                idisp[1]=7;   ompi_ddt_create_hindexed( 2, blocklen, disp, dt1, &dt2 );   ompi_ddt_commit( &dt2 );   ompi_ddt_type_lb( dt2, &lb );       ompi_ddt_type_ub( dt2, &ub );   ompi_ddt_type_extent( dt2, &ex );   ompi_ddt_type_size( dt2, &sz );   if (lb != -7 || ub != 13 || ex != 20) {      printf("hindexed lb %d ub %d extent %d size %d\n", (int)-7, (int)13, (int)20, (int)sz);      printf("hindexed lb %d ub %d extent %d size %d\n", (int)lb, (int)ub, (int)ex, (int)sz);      err++;   }   else      printf( "hindexed ok\n" );   ompi_ddt_create_indexed( 2, blocklen, idisp, dt1, &dt3 );   ompi_ddt_commit( &dt3 );   ompi_ddt_type_lb( dt3, &lb );       ompi_ddt_type_ub( dt3, &ub );   ompi_ddt_type_extent( dt3, &ex );   ompi_ddt_type_size( dt3, &sz );   if (lb != -39 || ub != 69 || ex != 108) {      printf("indexed lb %d ub %d extent %d size %d\n", (int)-39, (int)69, (int)108, (int)sz);      printf("indexed lb %d ub %d extent %d size %d\n", (int)lb, (int)ub, (int)ex, (int)sz);      err++;   }   else      printf( "indexed ok\n" );   ompi_ddt_create_hvector( 2, 1, 14, dt1, &dt4 );   ompi_ddt_commit( &dt4 );   ompi_ddt_type_lb( dt4, &lb );       ompi_ddt_type_ub( dt4, &ub );   ompi_ddt_type_extent( dt4, &ex );   ompi_ddt_type_size( dt4, &sz );   if (lb != -3 || ub != 20 || ex != 23) {      printf("hvector lb %d ub %d extent %d size %d\n", (int)-3, (int)20, (int)23, (int)sz);      printf("hvector lb %d ub %d extent %d size %d\n", (int)lb, (int)ub, (int)ex, (int)sz);      err++;   }   else      printf( "hvector ok\n" );   ompi_ddt_create_vector( 2, 1, 14, dt1, &dt5 );   ompi_ddt_commit( &dt5 );   ompi_ddt_type_lb( dt5, &lb );       ompi_ddt_type_ub( dt5, &ub );   ompi_ddt_type_extent( dt5, &ex );   ompi_ddt_type_size( dt5, &sz );   if (lb != -3 || ub != 132 || ex != 135) {      printf("vector lb %d ub %d extent %d size %d\n", (int)-3, (int)132, (int)135, (int)sz);      printf("vector lb %d ub %d extent %d size %d\n", (int)lb, (int)ub, (int)ex, (int)sz);      err++;   }   else      printf( "vector ok\n" );   OBJ_RELEASE( dt1 ); /*assert( dt1 == NULL );*/   OBJ_RELEASE( dt2 ); /*assert( dt2 == NULL );*/   OBJ_RELEASE( dt3 ); /*assert( dt3 == NULL );*/   OBJ_RELEASE( dt4 ); /*assert( dt4 == NULL );*/   OBJ_RELEASE( dt5 ); assert( dt5 == NULL );   return err;}void print_double_mat( unsigned int N, double* mat ){   unsigned int i, j;   double* pMat;   for( i = 0; i < N; i++ ) {      printf( "(%4d) :", i * N * (int)sizeof(double) );      pMat = mat + i * N;      for( j = 0; j < N; j++ ) {         printf( "%5.1f ", *pMat );         pMat++;      }      printf( "\n" );   }}static int init_random_upper_matrix( unsigned int N, double* mat ){    unsigned int i, j;    srand( time(NULL) );    for( i = 0; i < N; i++ ) {        mat += i;        for( j = i; j < N; j++ ) {            *mat = (double)random();            mat++;        }    }    return OMPI_SUCCESS;  }static int check_diag_matrix( unsigned int N, double* mat1, double* mat2 ){   unsigned int i, j;   for( i = 0; i < N; i++ ) {      mat1 += i;      mat2 += i;      for( j = i; j < N; j++ ) {         if( *mat1 != *mat2 ) {            printf( "error in position (%d, %d) expect %f and find %f\n",                    i, j, *mat1, *mat2 );            printf( "hex %lx != %lx\n", *(long*)mat1, *(long*)mat2 );            return OMPI_ERROR;         }         mat1++; mat2++;      }   }   return OMPI_SUCCESS;}static ompi_datatype_t* upper_matrix( unsigned int mat_size ){    int *disp, *blocklen;    unsigned int i;    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 + i;        blocklen[i] = mat_size - i;    }    ompi_ddt_create_indexed( mat_size, blocklen, disp, ompi_ddt_basicDatatypes[DT_DOUBLE],                             &upper );    ompi_ddt_commit( &upper );    if( outputFlags & DUMP_DATA_AFTER_COMMIT ) {        ompi_ddt_dump( upper );    }    free( disp );    free( blocklen );    return upper;}ompi_datatype_t* lower_matrix( unsigned int mat_size ){    int *disp, *blocklen;    unsigned int i;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -