root/test/datatype/ddt_raw2.c

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

DEFINITIONS

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

   1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
   2 /*
   3  * Copyright (c) 2019      The University of Tennessee and The University
   4  *                         of Tennessee Research Foundation.  All rights
   5  *                         reserved.
   6  * Copyright (c) 2019      Research Organization for Information Science
   7  *                         and Technology (RIST).  All rights reserved.
   8  * $COPYRIGHT$
   9  *
  10  * Additional copyrights may follow
  11  *
  12  * $HEADER$
  13  */
  14 
  15 #include "ompi_config.h"
  16 #include "ddt_lib.h"
  17 #include "opal/datatype/opal_convertor.h"
  18 #include "opal/datatype/opal_datatype_internal.h"
  19 #include "opal/runtime/opal.h"
  20 
  21 #include <time.h>
  22 #include <stdlib.h>
  23 #ifdef HAVE_SYS_TIME_H
  24 #include <sys/time.h>
  25 #endif
  26 #include <stdio.h>
  27 
  28 
  29 static int
  30 mca_common_ompio_decode_datatype ( ompi_datatype_t *datatype,
  31                                    int count,
  32                                    struct iovec **iov,
  33                                    uint32_t *iovec_count,
  34                                    int increment)
  35 {
  36 
  37 
  38 
  39     opal_convertor_t *convertor;
  40     size_t remaining_length = 0;
  41     uint32_t i;
  42     uint32_t temp_count;
  43     struct iovec *temp_iov=NULL;
  44     size_t temp_data;
  45 
  46 
  47     convertor = opal_convertor_create( opal_local_arch, 0 );
  48 
  49     if (OMPI_SUCCESS != opal_convertor_prepare_for_send (convertor,
  50                                                          &(datatype->super),
  51                                                          count,
  52                                                          NULL)) {
  53         opal_output (1, "Cannot attach the datatype to a convertor\n");
  54         return OMPI_ERROR;
  55     }
  56 
  57     if ( 0 == datatype->super.size ) {
  58         *iovec_count = 0;
  59         *iov = NULL;
  60         return OMPI_SUCCESS;
  61     }
  62 
  63     remaining_length = count * datatype->super.size;
  64 
  65     temp_count = increment;
  66     temp_iov = (struct iovec*)malloc(temp_count * sizeof(struct iovec));
  67     if (NULL == temp_iov) {
  68         opal_output (1, "OUT OF MEMORY\n");
  69         return OMPI_ERR_OUT_OF_RESOURCE;
  70     }
  71 
  72     while (0 == opal_convertor_raw(convertor,
  73                                    temp_iov,
  74                                    &temp_count,
  75                                    &temp_data)) {
  76         *iovec_count = *iovec_count + temp_count;
  77         *iov = (struct iovec *) realloc (*iov, *iovec_count * sizeof(struct iovec));
  78         if (NULL == *iov) {
  79             opal_output(1, "OUT OF MEMORY\n");
  80             free(temp_iov);
  81             return OMPI_ERR_OUT_OF_RESOURCE;
  82         }
  83         for (i=0 ; i<temp_count ; i++) {
  84             (*iov)[i+(*iovec_count-temp_count)].iov_base = temp_iov[i].iov_base;
  85             (*iov)[i+(*iovec_count-temp_count)].iov_len = temp_iov[i].iov_len;
  86         }
  87 
  88         remaining_length -= temp_data;
  89         temp_count = increment;
  90     }
  91     *iovec_count = *iovec_count + temp_count;
  92     if ( temp_count > 0 ) {
  93         *iov = (struct iovec *) realloc (*iov, *iovec_count * sizeof(struct iovec));
  94         if (NULL == *iov) {
  95             opal_output(1, "OUT OF MEMORY\n");
  96             free(temp_iov);
  97             return OMPI_ERR_OUT_OF_RESOURCE;
  98         }
  99     }
 100     for (i=0 ; i<temp_count ; i++) {
 101         (*iov)[i+(*iovec_count-temp_count)].iov_base = temp_iov[i].iov_base;
 102         (*iov)[i+(*iovec_count-temp_count)].iov_len = temp_iov[i].iov_len;
 103     }
 104 
 105     remaining_length -= temp_data;
 106 
 107     if (remaining_length != 0) {
 108         printf( "Not all raw description was been extracted (%lu bytes missing)\n",
 109                 (unsigned long) remaining_length );
 110     }
 111 
 112     free (temp_iov);
 113 
 114     return OMPI_SUCCESS;
 115 }
 116 
 117 int main (int argc, char *argv[]) {
 118     dt_elem_desc_t descs[185] = {
 119         { .loop = { { 16, 0}, 2, 4, -1, 16} },
 120         { .elem = { { 310, 9 }, 1, 12, 1, 4} },
 121         { .end_loop = { {16, 1}, 2, -1,  12, 4} },
 122         { .elem = { { 310, 9 }, 1, 1352, 1, 64} },
 123         { .loop = { { 16, 0}, 2, 3, -1, 16} },
 124         { .elem = { { 310, 9 }, 1, 8, 1, 1408} },
 125         { .end_loop = { {16, 1}, 2, -1,  8, 1424} },
 126         { .loop = { { 16, 0}, 2, 4, -1, 16} },
 127         { .elem = { { 310, 9 }, 1, 12, 1, 10932} },
 128         { .end_loop = { {16, 1}, 2, -1,  12, 10932} },
 129         { .elem = { { 310, 9 }, 1, 640, 1, 10992} },
 130         { .elem = { { 310, 9 }, 1, 712, 1, 14248} },
 131         { .loop = { { 16, 0}, 2, 3, -1, 16} },
 132         { .elem = { { 310, 9 }, 1, 8, 1, 14952} },
 133         { .end_loop = { {16, 1}, 2, -1,  8, 14968} },
 134         { .loop = { { 16, 0}, 2, 4, -1, 16} },
 135         { .elem = { { 310, 9 }, 1, 12, 1, 21860} },
 136         { .end_loop = { {16, 1}, 2, -1,  12, 21860} },
 137         { .elem = { { 310, 9 }, 1, 1352, 1, 21920} },
 138         { .loop = { { 16, 0}, 2, 3, -1, 16} },
 139         { .elem = { { 310, 9 }, 1, 8, 1, 23264} },
 140         { .end_loop = { {16, 1}, 2, -1,  8, 23280} },
 141         { .loop = { { 16, 0}, 2, 4, -1, 16} },
 142         { .elem = { { 310, 9 }, 1, 12, 1, 30172} },
 143         { .end_loop = { {16, 1}, 2, -1,  12, 30172} },
 144         { .elem = { { 310, 9 }, 1, 192, 1, 30232} },
 145         { .elem = { { 310, 9 }, 1, 1160, 1, 33040} },
 146         { .loop = { { 16, 0}, 2, 3, -1, 16} },
 147         { .elem = { { 310, 9 }, 1, 8, 1, 34192} },
 148         { .end_loop = { {16, 1}, 2, -1,  8, 34208} },
 149         { .loop = { { 16, 0}, 2, 4, -1, 16} },
 150         { .elem = { { 310, 9 }, 1, 12, 1, 41100} },
 151         { .end_loop = { {16, 1}, 2, -1,  12, 41100} },
 152         { .elem = { { 310, 9 }, 1, 1352, 1, 41160} },
 153         { .loop = { { 16, 0}, 2, 3, -1, 16} },
 154         { .elem = { { 310, 9 }, 1, 8, 1, 42504} },
 155         { .end_loop = { {16, 1}, 2, -1,  8, 42520} },
 156         { .loop = { { 16, 0}, 2, 4, -1, 16} },
 157         { .elem = { { 310, 9 }, 1, 12, 1, 52028} },
 158         { .end_loop = { {16, 1}, 2, -1,  12, 52028} },
 159         { .elem = { { 310, 9 }, 1, 1352, 1, 52088} },
 160         { .loop = { { 16, 0}, 2, 3, -1, 16} },
 161         { .elem = { { 310, 9 }, 1, 8, 1, 53432} },
 162         { .end_loop = { {16, 1}, 2, -1,  8, 53448} },
 163         { .loop = { { 16, 0}, 2, 4, -1, 16} },
 164         { .elem = { { 310, 9 }, 1, 12, 1, 60340} },
 165         { .end_loop = { {16, 1}, 2, -1,  12, 60340} },
 166         { .elem = { { 310, 9 }, 1, 1344, 1, 60400} },
 167         { .loop = { { 16, 0}, 2, 4, -1, 16} },
 168         { .elem = { { 310, 9 }, 1, 8, 1, 64360} },
 169         { .end_loop = { {16, 1}, 2, -1,  8, 64360} },
 170         { .loop = { { 16, 0}, 2, 4, -1, 16} },
 171         { .elem = { { 310, 9 }, 1, 12, 1, 71268} },
 172         { .end_loop = { {16, 1}, 2, -1,  12, 71268} },
 173         { .elem = { { 310, 9 }, 1, 1352, 1, 71328} },
 174         { .loop = { { 16, 0}, 2, 3, -1, 16} },
 175         { .elem = { { 310, 9 }, 1, 8, 1, 72672} },
 176         { .end_loop = { {16, 1}, 2, -1,  8, 72688} },
 177         { .loop = { { 16, 0}, 2, 4, -1, 16} },
 178         { .elem = { { 310, 9 }, 1, 12, 1, 79580} },
 179         { .end_loop = { {16, 1}, 2, -1,  12, 79580} },
 180         { .elem = { { 310, 9 }, 1, 896, 1, 79640} },
 181         { .elem = { { 310, 9 }, 1, 456, 1, 83152} },
 182         { .loop = { { 16, 0}, 2, 3, -1, 16} },
 183         { .elem = { { 310, 9 }, 1, 8, 1, 83600} },
 184         { .end_loop = { {16, 1}, 2, -1,  8, 83616} },
 185         { .loop = { { 16, 0}, 2, 4, -1, 16} },
 186         { .elem = { { 310, 9 }, 1, 12, 1, 90508} },
 187         { .end_loop = { {16, 1}, 2, -1,  12, 90508} },
 188         { .elem = { { 310, 9 }, 1, 1352, 1, 90568} },
 189         { .loop = { { 16, 0}, 2, 3, -1, 16} },
 190         { .elem = { { 310, 9 }, 1, 8, 1, 91912} },
 191         { .end_loop = { {16, 1}, 2, -1,  8, 91928} },
 192         { .loop = { { 16, 0}, 2, 4, -1, 16} },
 193         { .elem = { { 310, 9 }, 1, 12, 1, 98820} },
 194         { .end_loop = { {16, 1}, 2, -1,  12, 98820} },
 195         { .elem = { { 310, 9 }, 1, 448, 1, 98880} },
 196         { .elem = { { 310, 9 }, 1, 904, 1, 101944} },
 197         { .loop = { { 16, 0}, 2, 3, -1, 16} },
 198         { .elem = { { 310, 9 }, 1, 8, 1, 102840} },
 199         { .end_loop = { {16, 1}, 2, -1,  8, 102856} },
 200         { .loop = { { 16, 0}, 2, 4, -1, 16} },
 201         { .elem = { { 310, 9 }, 1, 12, 1, 109748} },
 202         { .end_loop = { {16, 1}, 2, -1,  12, 109748} },
 203         { .elem = { { 310, 9 }, 1, 1352, 1, 109808} },
 204         { .loop = { { 16, 0}, 2, 3, -1, 16} },
 205         { .elem = { { 310, 9 }, 1, 8, 1, 111152} },
 206         { .end_loop = { {16, 1}, 2, -1,  8, 111168} },
 207         { .loop = { { 16, 0}, 2, 4, -1, 16} },
 208         { .elem = { { 310, 9 }, 1, 12, 1, 118060} },
 209         { .end_loop = { {16, 1}, 2, -1,  12, 118060} },
 210         { .elem = { { 310, 9 }, 1, 1352, 1, 120736} },
 211         { .loop = { { 16, 0}, 2, 3, -1, 16} },
 212         { .elem = { { 310, 9 }, 1, 8, 1, 122080} },
 213         { .end_loop = { {16, 1}, 2, -1,  8, 122096} },
 214         { .loop = { { 16, 0}, 2, 4, -1, 16} },
 215         { .elem = { { 310, 9 }, 1, 12, 1, 128988} },
 216         { .end_loop = { {16, 1}, 2, -1,  12, 128988} },
 217         { .elem = { { 310, 9 }, 1, 1352, 1, 129048} },
 218         { .loop = { { 16, 0}, 2, 3, -1, 16} },
 219         { .elem = { { 310, 9 }, 1, 8, 1, 130392} },
 220         { .end_loop = { {16, 1}, 2, -1,  8, 130408} },
 221         { .loop = { { 16, 0}, 2, 4, -1, 16} },
 222         { .elem = { { 310, 9 }, 1, 12, 1, 139916} },
 223         { .end_loop = { {16, 1}, 2, -1,  12, 139916} },
 224         { .elem = { { 310, 9 }, 1, 1352, 1, 139976} },
 225         { .loop = { { 16, 0}, 2, 3, -1, 16} },
 226         { .elem = { { 310, 9 }, 1, 8, 1, 141320} },
 227         { .end_loop = { {16, 1}, 2, -1,  8, 141336} },
 228         { .loop = { { 16, 0}, 2, 4, -1, 16} },
 229         { .elem = { { 310, 9 }, 1, 12, 1, 148228} },
 230         { .end_loop = { {16, 1}, 2, -1,  12, 148228} },
 231         { .elem = { { 310, 9 }, 1, 1152, 1, 148288} },
 232         { .elem = { { 310, 9 }, 1, 200, 1, 152056} },
 233         { .loop = { { 16, 0}, 2, 3, -1, 16} },
 234         { .elem = { { 310, 9 }, 1, 8, 1, 152248} },
 235         { .end_loop = { {16, 1}, 2, -1,  8, 152264} },
 236         { .loop = { { 16, 0}, 2, 4, -1, 16} },
 237         { .elem = { { 310, 9 }, 1, 12, 1, 159156} },
 238         { .end_loop = { {16, 1}, 2, -1,  12, 159156} },
 239         { .elem = { { 310, 9 }, 1, 1352, 1, 159216} },
 240         { .loop = { { 16, 0}, 2, 3, -1, 16} },
 241         { .elem = { { 310, 9 }, 1, 8, 1, 160560} },
 242         { .end_loop = { {16, 1}, 2, -1,  8, 160576} },
 243         { .loop = { { 16, 0}, 2, 4, -1, 16} },
 244         { .elem = { { 310, 9 }, 1, 12, 1, 167468} },
 245         { .end_loop = { {16, 1}, 2, -1,  12, 167468} },
 246         { .elem = { { 310, 9 }, 1, 704, 1, 167528} },
 247         { .elem = { { 310, 9 }, 1, 648, 1, 170848} },
 248         { .loop = { { 16, 0}, 2, 3, -1, 16} },
 249         { .elem = { { 310, 9 }, 1, 8, 1, 171488} },
 250         { .end_loop = { {16, 1}, 2, -1,  8, 171504} },
 251         { .loop = { { 16, 0}, 2, 4, -1, 16} },
 252         { .elem = { { 310, 9 }, 1, 12, 1, 178396} },
 253         { .end_loop = { {16, 1}, 2, -1,  12, 178396} },
 254         { .elem = { { 310, 9 }, 1, 1352, 1, 178456} },
 255         { .loop = { { 16, 0}, 2, 3, -1, 16} },
 256         { .elem = { { 310, 9 }, 1, 8, 1, 179800} },
 257         { .end_loop = { {16, 1}, 2, -1,  8, 179816} },
 258         { .loop = { { 16, 0}, 2, 4, -1, 16} },
 259         { .elem = { { 310, 9 }, 1, 12, 1, 186708} },
 260         { .end_loop = { {16, 1}, 2, -1,  12, 186708} },
 261         { .elem = { { 310, 9 }, 1, 256, 1, 186768} },
 262         { .elem = { { 310, 9 }, 1, 1096, 1, 189640} },
 263         { .loop = { { 16, 0}, 2, 3, -1, 16} },
 264         { .elem = { { 310, 9 }, 1, 8, 1, 190728} },
 265         { .end_loop = { {16, 1}, 2, -1,  8, 190744} },
 266         { .loop = { { 16, 0}, 2, 4, -1, 16} },
 267         { .elem = { { 310, 9 }, 1, 12, 1, 197636} },
 268         { .end_loop = { {16, 1}, 2, -1,  12, 197636} },
 269         { .elem = { { 310, 9 }, 1, 1352, 1, 197696} },
 270         { .loop = { { 16, 0}, 2, 3, -1, 16} },
 271         { .elem = { { 310, 9 }, 1, 8, 1, 199040} },
 272         { .end_loop = { {16, 1}, 2, -1,  8, 199056} },
 273         { .loop = { { 16, 0}, 2, 4, -1, 16} },
 274         { .elem = { { 310, 9 }, 1, 12, 1, 208564} },
 275         { .end_loop = { {16, 1}, 2, -1,  12, 208564} },
 276         { .elem = { { 310, 9 }, 1, 1352, 1, 208624} },
 277         { .loop = { { 16, 0}, 2, 3, -1, 16} },
 278         { .elem = { { 310, 9 }, 1, 8, 1, 209968} },
 279         { .end_loop = { {16, 1}, 2, -1,  8, 209984} },
 280         { .elem = { { 310, 9 }, 1, 12, 1, 216876} },
 281         { .elem = { { 310, 9 }, 1, 16, 1, 216936} },
 282         { .elem = { { 310, 9 }, 1, 16, 1, 217000} },
 283         { .elem = { { 310, 9 }, 1, 16, 1, 217064} },
 284         { .elem = { { 310, 9 }, 1, 16, 1, 217128} },
 285         { .elem = { { 310, 9 }, 1, 16, 1, 217192} },
 286         { .elem = { { 310, 9 }, 1, 16, 1, 217256} },
 287         { .elem = { { 310, 9 }, 1, 16, 1, 217320} },
 288         { .elem = { { 310, 9 }, 1, 16, 1, 217384} },
 289         { .elem = { { 310, 9 }, 1, 16, 1, 217448} },
 290         { .elem = { { 310, 9 }, 1, 16, 1, 217512} },
 291         { .elem = { { 310, 9 }, 1, 16, 1, 217576} },
 292         { .elem = { { 310, 9 }, 1, 16, 1, 217640} },
 293         { .elem = { { 310, 9 }, 1, 16, 1, 217704} },
 294         { .elem = { { 310, 9 }, 1, 16, 1, 217768} },
 295         { .elem = { { 310, 9 }, 1, 16, 1, 217832} },
 296         { .elem = { { 310, 9 }, 1, 16, 1, 217896} },
 297         { .elem = { { 310, 9 }, 1, 16, 1, 217960} },
 298         { .elem = { { 310, 9 }, 1, 16, 1, 218024} },
 299         { .elem = { { 310, 9 }, 1, 16, 1, 218088} },
 300         { .elem = { { 310, 9 }, 1, 16, 1, 218152} },
 301         { .elem = { { 310, 9 }, 1, 16, 1, 218216} },
 302         { .elem = { { 310, 9 }, 1, 8, 1, 218280} },
 303         { .end_loop = { {0, 1}, 184, -1,  31684, 4} },
 304     };
 305     opal_init_util(NULL, NULL);
 306     ompi_datatype_init();
 307 
 308     ompi_datatype_t * datatype = OBJ_NEW(ompi_datatype_t);
 309 
 310     datatype->super.flags = 3332;
 311     datatype->super.id = 0;
 312     datatype->super.bdt_used = 512;
 313     datatype->super.size = 31684;
 314     datatype->super.true_lb = 4;
 315     datatype->super.true_ub = 218288;
 316     datatype->super.lb = 0;
 317     datatype->super.ub = 218344;
 318     datatype->super.nbElems = 31684;
 319     datatype->super.align = 1;
 320     datatype->super.loops = 1146;
 321     datatype->super.desc.length = 3351;
 322     datatype->super.desc.used = 184;
 323     datatype->super.desc.desc = descs;
 324     datatype->super.opt_desc.length = 3351;
 325     datatype->super.opt_desc.used = 184;
 326     datatype->super.opt_desc.desc = descs;
 327 
 328     /* Get the entire raw description of the datatype in a single call */
 329     uint32_t iovec_count_300 = 0;
 330     struct iovec * iov_300 = NULL;
 331     mca_common_ompio_decode_datatype ( datatype, 1, &iov_300, &iovec_count_300, 300);
 332     /* Get the raw description of the datatype 10 elements at the time. This stresses some
 333      * of the execution paths in the convertor raw.
 334      */
 335     uint32_t iovec_count_10 = 0;
 336     struct iovec * iov_10 = NULL;
 337     mca_common_ompio_decode_datatype ( datatype, 1, &iov_10, &iovec_count_10, 10);
 338     /* Get the raw description of the datatype one element at the time. This stresses all
 339      * execution paths in the convertor raw.
 340      */
 341     uint32_t iovec_count_1 = 0;
 342     struct iovec * iov_1 = NULL;
 343     mca_common_ompio_decode_datatype ( datatype, 1, &iov_1, &iovec_count_1, 1);
 344 
 345 
 346     assert(iovec_count_300 == iovec_count_10);
 347     assert(iovec_count_300 == iovec_count_1);
 348     // assert(iov[100].iov_base == iov2[100].iov_base);
 349     // assert(iov[100].iov_len == iov2[100].iov_len);
 350     for (uint32_t i = 0; i < iovec_count_300; i++) {
 351         assert(iov_300[i].iov_base == iov_10[i].iov_base);
 352         assert(iov_300[i].iov_len == iov_10[i].iov_len);
 353         assert(iov_300[i].iov_base == iov_1[i].iov_base);
 354         assert(iov_300[i].iov_len == iov_1[i].iov_len);
 355     }
 356 
 357     return 0;
 358 }
 359 

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