root/test/datatype/large_data.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. count_length_via_convertor_raw
  2. main

   1 /* -*- Mode: C; c-basic-offset:4 ; -*- */
   2 /*
   3  * Copyright (c) 2018      The University of Tennessee and The University
   4  *                         of Tennessee Research Foundation.  All rights
   5  *                         reserved.
   6  * $COPYRIGHT$
   7  *
   8  * Additional copyrights may follow
   9  *
  10  * $HEADER$
  11  */
  12 
  13 /**
  14  * This test check the correct OMPI datatype description for
  15  * extremely large types (over 4GB).
  16  */
  17 
  18 #include <mpi.h>
  19 #include <stdio.h>
  20 #include <stddef.h>
  21 #include <stdlib.h>
  22 #include <string.h>
  23 
  24 #include "ompi_config.h"
  25 #include "ompi/datatype/ompi_datatype.h"
  26 #include "opal/runtime/opal.h"
  27 #include "opal/datatype/opal_convertor.h"
  28 #include "opal/datatype/opal_datatype_internal.h"
  29 
  30 #define MAX_IOVEC 10
  31 #define MAX_CHUNK (1024*1024*1024)  /* 1GB */
  32 
  33 static int verbose = 0;
  34 
  35 static size_t
  36 count_length_via_convertor_raw(char* msg,
  37                                MPI_Datatype dtype, int count)
  38 {
  39     opal_convertor_t* pconv;
  40     struct iovec iov[MAX_IOVEC];
  41     uint32_t iov_count = MAX_IOVEC, i;
  42     size_t length = MAX_CHUNK, packed_iovec = 0, packed = 0;
  43 
  44     pconv = opal_convertor_create( opal_local_arch, 0 );
  45     opal_convertor_prepare_for_send(pconv, (const struct opal_datatype_t *)dtype, 1, NULL);
  46     while( 0 == opal_convertor_raw(pconv, iov, &iov_count, &length) ) {
  47         if( verbose ) {
  48             printf("iov_count = %d packed_iovec = %"PRIsize_t" length = %"PRIsize_t"\n",
  49                    iov_count, packed_iovec, length);
  50         }
  51         packed += length;
  52         for( i = 0; i < iov_count; i++ ) {
  53             packed_iovec += iov[i].iov_len;
  54             if( verbose ) {
  55                 printf("[%s] add %"PRIsize_t" bytes -> so far %"PRIsize_t" bytes\n",
  56                        msg, iov[i].iov_len, packed_iovec);
  57             }
  58         }
  59         if( packed != packed_iovec ) {
  60             printf( "[%s] Raw data amount diverges %"PRIsize_t" != %"PRIsize_t"\n",
  61                     msg, packed, packed_iovec);
  62             exit(-1);
  63         }
  64         iov_count = MAX_IOVEC;  /* number of available iov */
  65         length = MAX_CHUNK;
  66     }
  67     if( verbose ) {
  68         printf("iov_count = %d packed_iovec = %"PRIsize_t" length = %"PRIsize_t"\n",
  69                iov_count, packed_iovec, length);
  70     }
  71     packed += length;
  72     for( i = 0; i < iov_count; i++ ) {
  73         packed_iovec += iov[i].iov_len;
  74         if( verbose ) {
  75             printf("[%s] add %"PRIsize_t" bytes -> so far %"PRIsize_t" bytes\n",
  76                    msg, iov[i].iov_len, packed_iovec);
  77         }
  78     }
  79     if( packed != packed_iovec ) {
  80         printf( "[%s] Raw data amount diverges %"PRIsize_t" != %"PRIsize_t"\n",
  81                 msg, packed, packed_iovec);
  82         exit(-1);
  83     }
  84     return packed_iovec;
  85 }
  86 
  87 int main(int argc, char * argv[])
  88 {
  89 
  90     int const per_process = 192;
  91     int const per_type = 20000000;
  92     int blocklen, stride, count;
  93 
  94     int scounts[2] = {per_process, per_process};
  95     int sdispls[2] = {3*per_process, 0*per_process};
  96     int rcounts[2] = {per_process, per_process};
  97     int rdispls[2] = {1*per_process, 2*per_process};
  98 
  99     MPI_Datatype ddt, stype, rtype;
 100     size_t length, packed;
 101 
 102     opal_init_util(&argc, &argv);
 103     ompi_datatype_init();
 104 
 105     ompi_datatype_create_contiguous( per_type, MPI_FLOAT, &ddt);
 106 
 107     /*
 108      * Large sparse datatype: indexed contiguous
 109      */
 110     ompi_datatype_create_indexed(2, scounts, sdispls, ddt, &stype);
 111     ompi_datatype_commit(&stype);
 112 
 113     packed = count_length_via_convertor_raw("1. INDEX", stype, 1);
 114     opal_datatype_type_size(&stype->super, &length);
 115     if( length != packed ) {
 116         printf("Mismatched length of packed data to datatype size (%"PRIsize_t" != %"PRIsize_t")\n",
 117                packed, length);
 118         exit(-2);
 119     }
 120     ompi_datatype_destroy(&stype);
 121 
 122     /*
 123      * Large contiguous datatype: indexed contiguous
 124      */
 125     ompi_datatype_create_indexed(2, rcounts, rdispls, ddt, &rtype);
 126     ompi_datatype_commit(&rtype);
 127 
 128     packed = count_length_via_convertor_raw("2. INDEX", rtype, 1);
 129     opal_datatype_type_size(&rtype->super, &length);
 130     if( length != packed ) {
 131         printf("Mismatched length of packed data to datatype size (%"PRIsize_t" != %"PRIsize_t")\n",
 132                packed, length);
 133         exit(-2);
 134     }
 135     ompi_datatype_destroy(&rtype);
 136     ompi_datatype_destroy(&ddt);
 137 
 138     /*
 139      * Large sparse datatype: vector
 140      */
 141     count = INT_MAX / 2;
 142     blocklen = stride = 4;
 143     ompi_datatype_create_vector(count, blocklen, stride, MPI_FLOAT, &ddt);
 144     ompi_datatype_commit(&ddt);
 145 
 146     packed = count_length_via_convertor_raw("3. VECTOR", ddt, 1);
 147     opal_datatype_type_size(&ddt->super, &length);
 148     if( length != packed ) {
 149         printf("Mismatched length of packed data to datatype size (%"PRIsize_t" != %"PRIsize_t")\n",
 150                packed, length);
 151         exit(-2);
 152     }
 153     ompi_datatype_destroy(&ddt);
 154 
 155     /*
 156      * Large sparse datatype: contiguous
 157      */
 158     MPI_Datatype tmp;
 159     ompi_datatype_create_contiguous(stride, MPI_FLOAT, &tmp);
 160     ompi_datatype_create_contiguous(count, tmp, &ddt);
 161     ompi_datatype_commit(&ddt);
 162 
 163     packed = count_length_via_convertor_raw("4. CONTIG", ddt, 1);
 164     opal_datatype_type_size(&ddt->super, &length);
 165     if( length != packed ) {
 166         printf("Mismatched length of packed data to datatype size (%"PRIsize_t" != %"PRIsize_t")\n",
 167                packed, length);
 168         exit(-2);
 169     }
 170     ompi_datatype_destroy(&ddt);
 171     ompi_datatype_destroy(&tmp);
 172 
 173     return 0;
 174 }

/* [<][>][^][v][top][bottom][index][help] */