George,

you do not need any hardware, just download MPSS from Intel and install it.
make sure the mic kernel module is loaded *and* you can read/write to the
newly created /dev/mic/* devices.

/* i am now running this on a virtual machine with no MIC whatsoever */

i was able to improve things a bit for the new attached test case
/* send MPI_PACKED / recv newtype */
with the attached unpack.patch.

it has to be applied on r31678 (aka the latest checkout of the v1.8 branch)

with this patch (zero regression test so far, it might solve one problem
but break anything else !)

mpirun -np 2 -host localhost --mca btl,scif,vader ./test_scif2
works fine :-)

but

mpirun -np 2 -host localhost --mca btl scif,vader ./test_scif2
still crashes (and it did not crash before r31496)

i will provide the output you requested shortly

Cheers,

Gilles
/*
 * This test is an oversimplified version of collective/bcast_struct
 * that comes with the ibm test suite.
 * it must be ran on two tasks on a single host where the MIC software stack
 * is present (e.g. libscif.so is present, the mic driver is loaded and
 * /dev/mic/* are accessible and the scif btl is available.
 *
 * mpirun -np 2 -host localhost --mca scif,vader,self ./test_scif
 * will produce incorrect results with trunk and v1.8
 *
 * mpirun -np 2 --mca btl ^scif -host localhost ./test_scif
 * will work with trunk and v1.8
 *
 * mpirun -np 2 --mca btl scif,self -host localhost ./test_scif
 * will produce correct results with v1.8 r31309 (but eventually crash in 
MPI_Finalize)
 * and produce incorrect result with v1.8 r31671 and trunk r31667
 *
 * Copyright (c) 2011      Oracle and/or its affiliates.  All rights reserved.
 * Copyright (c) 2014      Research Organization for Information Science
 *                         and Technology (RIST). All rights reserved.
 */
/****************************************************************************

 MESSAGE PASSING INTERFACE TEST CASE SUITE

 Copyright IBM Corp. 1995

 IBM Corp. hereby grants a non-exclusive license to use, copy, modify, and
 distribute this software for any purpose and without fee provided that the
 above copyright notice and the following paragraphs appear in all copies.

 IBM Corp. makes no representation that the test cases comprising this
 suite are correct or are an accurate representation of any standard.

 In no event shall IBM be liable to any party for direct, indirect, special
 incidental, or consequential damage arising out of the use of this software
 even if IBM Corp. has been advised of the possibility of such damage.

 IBM CORP. SPECIFICALLY DISCLAIMS ANY WARRANTIES INCLUDING, BUT NOT LIMITED
 TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS AND IBM
 CORP. HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
 ENHANCEMENTS, OR MODIFICATIONS.

****************************************************************************

 These test cases reflect an interpretation of the MPI Standard.  They are
 are, in most cases, unit tests of specific MPI behaviors.  If a user of any
 test case from this set believes that the MPI Standard requires behavior
 different than that implied by the test case we would appreciate feedback.

 Comments may be sent to:
    Richard Treumann
    treum...@kgn.ibm.com

****************************************************************************
*/
#include <stdio.h>
#include <stdlib.h>
#include <poll.h>
#include "mpi.h"

#define ompitest_error(file,line,...) {fprintf(stderr, "FUCK at %s:%d root=%d 
size=%d (i,j)=(%d,%d)\n", file, line,root, i0, i, j); MPI_Abort(MPI_COMM_WORLD, 
1);}

const int SIZE = 1000;

int main(int argc, char **argv)
{
   int myself;

   double a[2], t_stop;
   int ii, size;
   int len[2];
   MPI_Aint disp[2];
   MPI_Datatype type[2], newtype, t1, t2;
   struct foo_t {
       int i[3];
       double d[3];
   } foo, *bar;
   struct pfoo_t {
       int i[2];
       double d[2];
   } pfoo, *pbar;
   int i0, i, j, root, nseconds = 600, done_flag;
   int _dbg=0;

   MPI_Init(&argc,&argv);
   MPI_Comm_rank(MPI_COMM_WORLD,&myself);
   MPI_Comm_size(MPI_COMM_WORLD,&size);
   // _dbg = (0 == myself);
   while (_dbg) poll(NULL,0,1);

   if ( argc > 1 ) nseconds = atoi(argv[1]);
   t_stop = MPI_Wtime() + nseconds;

   /*-------------------------------------------------------------*/
   /* Build a datatype that is guaranteed to have holes; send/recv
      large numbers of them */

   MPI_Type_vector(2, 1, 2, MPI_INT, &t1);
   MPI_Type_commit(&t1);
   MPI_Type_vector(2, 1, 2, MPI_DOUBLE, &t2);
   MPI_Type_commit(&t2);

   len[0] = len[1] = 1;
   MPI_Address(&foo.i[0], &disp[0]);
   MPI_Address(&foo.d[0], &disp[1]);
   printf ("%d: %x %x\n", myself, disp[0], disp[1]);
   disp[0] -= (MPI_Aint) &foo;
   disp[1] -= (MPI_Aint) &foo;
   printf ("%d: %ld %ld\n", myself, disp[0], disp[1]);
   type[0] = t1;
   type[1] = t2;
   MPI_Type_struct(2, len, disp, type, &newtype);
   MPI_Type_commit(&newtype);

#if 0
   if (0 == myself) {
       foo.i[0] = 123;
       foo.i[1] = 456;
       foo.i[2] = 789;
       foo.d[0] = 123.456;
       foo.d[1] = 456.789;
       foo.d[2] = 789.123;
       pfoo.i[0] = 123;
       pfoo.i[1] = 789;
       pfoo.d[0] = 123.456;
       pfoo.d[1] = 789.123;
       // MPI_Send(&foo, 1, newtype, 1, 1234, MPI_COMM_WORLD);
       MPI_Send(&pfoo, sizeof(pfoo), MPI_PACKED, 1, 1234, MPI_COMM_WORLD);
   } else if (1 == myself) {
       foo.i[0] = foo.i[1] = foo.i[2] = 0;
       foo.d[0] = foo.d[1] = foo.d[2] = 0.0;
       MPI_Recv(&foo, 1, newtype, 0, 1234, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
       if (foo.i[0] != 123 ||
           foo.i[1] != 0 ||
           foo.i[2] != 789 ||
           foo.d[0] != 123.456 ||
           foo.d[1] != 0.0 ||
           foo.d[2] != 789.123) {
           ompitest_error(__FILE__, __LINE__, 
                          "Simple receive failed: got (%d, %d, %d, %g, %g, %g), 
expected (%d, %d, %d, %g, %g, %g)\n",
                          foo.i[0],
                          foo.i[1],
                          foo.i[2],
                          foo.d[0],
                          foo.d[1],
                          foo.d[2],
                          123, 0, 789, 123.456, 0.0, 789.123);
       }
   }
   MPI_Barrier(MPI_COMM_WORLD);
#endif

   if (0 == myself) {
       pbar = malloc(sizeof(pfoo) * SIZE);
   } else {
       bar = malloc(sizeof(foo) * SIZE);
   }

   // for (i0 = SIZE; i0 <= SIZE; i0 *= 10) {
   i0 = SIZE; {
       i = i0;
       // for (root = 0; root < size; ++root) {
       for (root = 0; root < 1; ++root) {

           /* Initialize buffers */
           for (j = 0; j < i; ++j) {
               if (root == myself) {
                   pbar[j].i[0] = 123;
                   pbar[j].i[1] = 789;
                   pbar[j].d[0] = 123.456;
                   pbar[j].d[1] = 789.123;
               } else {
                   bar[j].i[0] = bar[j].i[1] = bar[j].i[2] = 0;
                   bar[j].d[0] = bar[j].d[1] = bar[j].d[2] = 0.0;
               }
           }

    if (root == myself) {
        // MPI_Send(bar, i, newtype, 1-root, 666, MPI_COMM_WORLD);
        MPI_Send(pbar, i*sizeof(pfoo), MPI_PACKED, 1-root, 666, MPI_COMM_WORLD);
    } else {
        MPI_Recv(bar, i, newtype, root, 666, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    }

           /* Make sure we got the right values */
           if (root != myself) {
               for (j = 0; j < i; ++j) {
                   if (bar[j].i[0] != 123 ||
                       bar[j].i[1] != 0 ||
                       bar[j].i[2] != 789 ||
                       bar[j].d[0] != 123.456 ||
                       bar[j].d[1] != 0.0 ||
                       bar[j].d[2] != 789.123) {
                       fprintf(stderr, "ERROR at %s:%d! root=%d, me=%d, 
count=%d, position=%d, got (%d,%d,%d,%g,%g,%g) expected (%d,%d,%d,%g,%g,%g)\n", 
                                      __FILE__, __LINE__,
                                      root, myself, i, j,
                                      bar[j].i[0],
                                      bar[j].i[1],
                                      bar[j].i[2],
                                      bar[j].d[0],
                                      bar[j].d[1],
                                      bar[j].d[2],
                                      123, 0, 789, 123.456, 0.0, 789.123);
                     MPI_Abort(MPI_COMM_WORLD, 1);
                   }
               }
           }

       }
   }

done:
   if (0 == myself) {
      free(pbar);
   } else {
      free(bar);
   }
   MPI_Type_free(&t1);
   MPI_Type_free(&t2);
   MPI_Type_free(&newtype);

   MPI_Barrier(MPI_COMM_WORLD);
   printf("end barrier\n");
   _dbg = 0;
   while (_dbg) poll(NULL,0,1);
   MPI_Finalize();
   printf("after finalize\n");
   return 0;
}
Index: opal/datatype/opal_datatype_unpack.c
===================================================================
--- opal/datatype/opal_datatype_unpack.c        (revision 31678)
+++ opal/datatype/opal_datatype_unpack.c        (working copy)
@@ -171,6 +171,8 @@
     uint32_t i, length, count_desc = 1;
     size_t data_length = 
opal_datatype_basicDatatypes[pElem->elem.common.type]->size;

+// GG
+    *user_buffer += pConvertor->pStack->disp;
     DO_DEBUG( opal_output( 0, "unpack partial data start %lu end %lu 
data_length %lu user %p\n"
                            "\tbConverted %lu total_length %lu count %d\n",
                            (unsigned long)start_position, (unsigned 
long)end_position, (unsigned long)data_length, *user_buffer,
@@ -230,6 +232,8 @@
             real_data[i] = saved_data[i];
     }
 #endif
+// GG
+    *user_buffer -= pConvertor->pStack->disp;
     return 0;
 }

Reply via email to