Any comments on this?  We wanted to clean up MPI_THREAD_MULTIPLE support in the trunk and port these changes back to 1.5.x, but it's unclear to me what our expectations should be about any MPI_THREAD_MULTIPLE test succeeding.  How do we assess (test) our changes?  Or, should we just hardwire thread support to be off, as we have done with progress threads?

-------- Original Message --------
Subject: [OMPI devel] multi-threaded test
Date: Tue, 08 Mar 2011 11:24:20 -0800
From: Eugene Loh <eugene....@oracle.com>
To: Open MPI Developers <de...@open-mpi.org>


I've been assigned CMR 2728, which is to apply some thread-support 
changes to 1.5.x.  The trac ticket has amusing language about "needs 
testing".  I'm not sure what that means.  We rather consistently say 
that we don't promise anything with regards to true thread support.  We 
specifically say certain BTLs are off limits and we say things are 
poorly tested and can be expected to break.  Given all that, what does 
it mean to test thread support in OMPI?

One option, specifically in the context of this CMR, is to test only 
configuration options and so on.  I've done this.

Another possibility is to confirm that simple run-time tests of 
multi-threaded message passing succeed.  I'm having trouble with this.

Attached is a simple test.  It passes over sm but fails over TCP.  (One 
or both of the initial messages is not received.)

How high should I set my sights on this?

#include <stdio.h>
#include <omp.h>
#include <mpi.h>
#include <string.h>  /* memset */


#define N 10000
int main(int argc, char **argv) {
  int np, me, buf[2][N], provided;

  /* init some stuff */
  MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &provided);
  MPI_Comm_size(MPI_COMM_WORLD,&np);
  MPI_Comm_rank(MPI_COMM_WORLD,&me);
  if ( provided < MPI_THREAD_MULTIPLE ) MPI_Abort(MPI_COMM_WORLD,-1);

  /* initialize the buffers */
  memset(buf[0], 0, N * sizeof(int));
  memset(buf[1], 0, N * sizeof(int));

  /* test */
  #pragma omp parallel num_threads(2)
  {
    int id = omp_get_thread_num();
    MPI_Status st;
    printf("%d %d in parallel region\n", me, id); fflush(stdout);

    /* pingpong */
    if ( me == 0 ) {
      MPI_Send(buf[id],N,MPI_INT,1,7+id,MPI_COMM_WORLD    ); printf("%d %d sent\n",me,id); fflush(stdout);
      MPI_Recv(buf[id],N,MPI_INT,1,7+id,MPI_COMM_WORLD,&st); printf("%d %d recd\n",me,id); fflush(stdout);
    } else {
      MPI_Recv(buf[id],N,MPI_INT,0,7+id,MPI_COMM_WORLD,&st); printf("%d %d recd\n",me,id); fflush(stdout);
      MPI_Send(buf[id],N,MPI_INT,0,7+id,MPI_COMM_WORLD    ); printf("%d %d sent\n",me,id); fflush(stdout);
    }
  }

  MPI_Finalize();

  return 0;
}


#!/bin/csh

mpicc -xopenmp -m64 -O5 main.c

mpirun -np 2 --mca btl self,sm  ./a.out
mpirun -np 2 --mca btl self,tcp ./a.out


_______________________________________________
devel mailing list
de...@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/devel

Reply via email to