[mpich-commits] [mpich] MPICH primary repository branch, master, updated. v3.1rc1-16-g40c6fda

mysql vizuser noreply at mpich.org
Wed Nov 13 10:12:25 CST 2013


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "MPICH primary repository".

The branch, master has been updated
       via  40c6fda95428adbaf8938d33031d24b160af9539 (commit)
       via  85e4a5072e3b1edd3651357601e9e72c18f887b6 (commit)
       via  ad44b6b335b1b07b4ef9c4baf22341ad6d76710e (commit)
      from  120bff0671e8d034262af5060a33cb7836a2513c (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://git.mpich.org/mpich.git/commitdiff/40c6fda95428adbaf8938d33031d24b160af9539

commit 40c6fda95428adbaf8938d33031d24b160af9539
Author: Huiwei Lu <huiweilu at mcs.anl.gov>
Date:   Wed Nov 13 10:01:25 2013 -0600

    Fix #1879 - fix test script
    
    fix testlist
    
    Signed-off-by: Junchao Zhang <jczhang at mcs.anl.gov>

diff --git a/test/mpi/threads/pt2pt/testlist b/test/mpi/threads/pt2pt/testlist
index ce8fc9c..b6ab43e 100644
--- a/test/mpi/threads/pt2pt/testlist
+++ b/test/mpi/threads/pt2pt/testlist
@@ -8,4 +8,4 @@ multisend3 5
 multisend4 5
 greq_wait 1
 greq_test 1
-ibtest 2
+ibsend 2

http://git.mpich.org/mpich.git/commitdiff/85e4a5072e3b1edd3651357601e9e72c18f887b6

commit 85e4a5072e3b1edd3651357601e9e72c18f887b6
Author: Huiwei Lu <huiweilu at mcs.anl.gov>
Date:   Mon Nov 11 11:28:22 2013 -0600

    Fix #1879 - false alarm, bug is in user code
    
    First, this ticket is caused in the user code of ibsend.c where multiple
    pthreads are created using the same pthread variable. This leads
    to unexpected behaviors where detached threads screw
    up with MPI_Comm_free when both of them calls ALLFUNC lock in
    unexpected order, thus leads to the assertion failure in initthread.c:213.
    
    Second, BSEND lock in the proposed patch in trac is unnecessary.
    Basically the patch is to create a
    new lock, BSEND, to lock the function of MPIR_Bsend_isend for thread
    safety; however, MPIR_Bsend_isend is already called inside a ALLFUNC
    lock both in MPI_Bsend and MPI_Ibsend.
    
    See attached test/mpi/threads/pt2pt/ibsend.c for correct use of
    pthread_create and pthread_join

diff --git a/test/mpi/threads/pt2pt/ibsend.c b/test/mpi/threads/pt2pt/ibsend.c
index 168c2fd..c21fd69 100644
--- a/test/mpi/threads/pt2pt/ibsend.c
+++ b/test/mpi/threads/pt2pt/ibsend.c
@@ -1,19 +1,19 @@
 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
 /*
-  This program performs a short test of MPI_BSEND in a
-  multithreaded environment.
+   This program performs a short test of MPI_BSEND in a
+   multithreaded environment.
 
-  It starts a single receiver thread that expects
-  NUMSENDS messages and NUMSENDS sender threads, that
-  use MPI_Bsend to send a message of size MSGSIZE
-  to its right neigbour or rank 0 if (my_rank==comm_size-1), i.e.
-    target_rank = (my_rank+1)%size .
+   It starts a single receiver thread that expects
+   NUMSENDS messages and NUMSENDS sender threads, that
+   use MPI_Bsend to send a message of size MSGSIZE
+   to its right neigbour or rank 0 if (my_rank==comm_size-1), i.e.
+   target_rank = (my_rank+1)%size .
 
-  After all messages have been received, the
-  receiver thread prints a message, the threads
-  are joined into the main thread and the application
-  terminates.
-*/
+   After all messages have been received, the
+   receiver thread prints a message, the threads
+   are joined into the main thread and the application
+   terminates.
+   */
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -37,7 +37,7 @@ void *receiver(void *ptr)
         MPI_Recv(buf, MSGSIZE, MPI_CHAR, MPI_ANY_SOURCE, MPI_ANY_TAG,
                  MPI_COMM_WORLD, MPI_STATUS_IGNORE);
 
-    return NULL;
+    pthread_exit(NULL);
 }
 
 
@@ -46,7 +46,8 @@ void *sender_bsend(void *ptr)
     char buffer[MSGSIZE];
     MPI_Bsend(buffer, MSGSIZE, MPI_CHAR, (rank + 1) % size, 0,
               MPI_COMM_WORLD);
-    return NULL;
+
+    pthread_exit(NULL);
 }
 
 void *sender_ibsend(void *ptr)
@@ -57,7 +58,7 @@ void *sender_ibsend(void *ptr)
                MPI_COMM_WORLD, &req);
     MPI_Wait(&req, MPI_STATUS_IGNORE);
 
-    return NULL;
+    pthread_exit(NULL);
 }
 
 void *sender_isend(void *ptr)
@@ -67,7 +68,8 @@ void *sender_isend(void *ptr)
     MPI_Isend(buffer, MSGSIZE, MPI_CHAR, (rank + 1) % size, 0,
               MPI_COMM_WORLD, &req);
     MPI_Wait(&req, MPI_STATUS_IGNORE);
-    return NULL;
+
+    pthread_exit(NULL);
 }
 
 void *sender_send(void *ptr)
@@ -75,16 +77,19 @@ void *sender_send(void *ptr)
     char buffer[MSGSIZE];
     MPI_Send(buffer, MSGSIZE, MPI_CHAR, (rank + 1) % size, 0,
              MPI_COMM_WORLD);
-    return NULL;
+
+    pthread_exit(NULL);
 }
 
 int main(int argc, char *argv[])
 {
 
     int provided, i[2], k;
-    char *buffer;
+    char *buffer, *ptr_dt;
+    buffer = (char *) malloc(BUFSIZE * sizeof(char));
     MPI_Status status;
-    pthread_t receiver_thread, sender_thread;
+    pthread_t receiver_thread, sender_thread[NUMSENDS];
+    pthread_attr_t attr;
     MPI_Comm communicator;
     int bs;
 
@@ -95,7 +100,7 @@ int main(int argc, char *argv[])
         MPI_Abort(911, MPI_COMM_WORLD);
     }
 
-    MPI_Buffer_attach(malloc(BUFSIZE), BUFSIZE);
+    MPI_Buffer_attach(buffer, BUFSIZE);
 
     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
     MPI_Comm_size(MPI_COMM_WORLD, &size);
@@ -104,43 +109,48 @@ int main(int argc, char *argv[])
                                                            If the MPI_Comm_dup() call is commented out, it is still
                                                            evident but does not appear that often (don't know why) */
 
-    pthread_create(&receiver_thread, NULL, &receiver, NULL);
+    /* Initialize and set thread detached attribute */
+    pthread_attr_init(&attr);
+    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
+
+    pthread_create(&receiver_thread, &attr, &receiver, NULL);
     for (k = 0; k < NUMSENDS; k++)
-        pthread_create(&sender_thread, NULL, &sender_bsend, NULL);
+        pthread_create(&sender_thread[k], &attr, &sender_bsend, NULL);
     pthread_join(receiver_thread, NULL);
     for (k = 0; k < NUMSENDS; k++)
-        pthread_join(sender_thread, NULL);
+        pthread_join(sender_thread[k], NULL);
     MPI_Barrier(MPI_COMM_WORLD);
 
-    pthread_create(&receiver_thread, NULL, &receiver, NULL);
+    pthread_create(&receiver_thread, &attr, &receiver, NULL);
     for (k = 0; k < NUMSENDS; k++)
-        pthread_create(&sender_thread, NULL, &sender_ibsend, NULL);
+        pthread_create(&sender_thread[k], &attr, &sender_ibsend, NULL);
     pthread_join(receiver_thread, NULL);
     for (k = 0; k < NUMSENDS; k++)
-        pthread_join(sender_thread, NULL);
+        pthread_join(sender_thread[k], NULL);
     MPI_Barrier(MPI_COMM_WORLD);
 
-    pthread_create(&receiver_thread, NULL, &receiver, NULL);
+    pthread_create(&receiver_thread, &attr, &receiver, NULL);
     for (k = 0; k < NUMSENDS; k++)
-        pthread_create(&sender_thread, NULL, &sender_isend, NULL);
+        pthread_create(&sender_thread[k], &attr, &sender_isend, NULL);
     pthread_join(receiver_thread, NULL);
     for (k = 0; k < NUMSENDS; k++)
-        pthread_join(sender_thread, NULL);
+        pthread_join(sender_thread[k], NULL);
     MPI_Barrier(MPI_COMM_WORLD);
 
-    pthread_create(&receiver_thread, NULL, &receiver, NULL);
+    pthread_create(&receiver_thread, &attr, &receiver, NULL);
     for (k = 0; k < NUMSENDS; k++)
-        pthread_create(&sender_thread, NULL, &sender_send, NULL);
+        pthread_create(&sender_thread[k], &attr, &sender_send, NULL);
     pthread_join(receiver_thread, NULL);
     for (k = 0; k < NUMSENDS; k++)
-        pthread_join(sender_thread, NULL);
+        pthread_join(sender_thread[k], NULL);
     MPI_Barrier(MPI_COMM_WORLD);
 
+    pthread_attr_destroy(&attr);
     if (!rank)
         printf( " No Errors\n" );
 
     MPI_Comm_free(&communicator);
-    MPI_Buffer_detach(&buffer, &bs);
+    MPI_Buffer_detach(&ptr_dt, &bs);
     free(buffer);
     MPI_Finalize();
 }

http://git.mpich.org/mpich.git/commitdiff/ad44b6b335b1b07b4ef9c4baf22341ad6d76710e

commit ad44b6b335b1b07b4ef9c4baf22341ad6d76710e
Author: Huiwei Lu <huiweilu at mcs.anl.gov>
Date:   Wed Nov 6 18:06:02 2013 -0600

    Fix #1879 - Adds a test case for ibsend
    
    Adds a test case for ibsend/bsend/isend/send in threading
    execution.

diff --git a/test/mpi/threads/pt2pt/Makefile.am b/test/mpi/threads/pt2pt/Makefile.am
index efa573b..7030260 100644
--- a/test/mpi/threads/pt2pt/Makefile.am
+++ b/test/mpi/threads/pt2pt/Makefile.am
@@ -10,5 +10,5 @@ include $(top_srcdir)/threads/Makefile_threads.mtest
 EXTRA_DIST = testlist
 
 noinst_PROGRAMS = threads threaded_sr alltoall sendselfth greq_wait greq_test \
-                  multisend multisend2 multisend3 multisend4
+                  multisend multisend2 multisend3 multisend4 ibsend
 
diff --git a/test/mpi/threads/pt2pt/ibsend.c b/test/mpi/threads/pt2pt/ibsend.c
new file mode 100644
index 0000000..168c2fd
--- /dev/null
+++ b/test/mpi/threads/pt2pt/ibsend.c
@@ -0,0 +1,146 @@
+/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
+/*
+  This program performs a short test of MPI_BSEND in a
+  multithreaded environment.
+
+  It starts a single receiver thread that expects
+  NUMSENDS messages and NUMSENDS sender threads, that
+  use MPI_Bsend to send a message of size MSGSIZE
+  to its right neigbour or rank 0 if (my_rank==comm_size-1), i.e.
+    target_rank = (my_rank+1)%size .
+
+  After all messages have been received, the
+  receiver thread prints a message, the threads
+  are joined into the main thread and the application
+  terminates.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <mpi.h>
+#include <string.h>
+#include "mpitest.h"
+#include "mpithreadtest.h"
+
+#define NUMSENDS 32
+#define BUFSIZE 10000000
+#define MSGSIZE 1024
+
+int rank, size;
+
+void *receiver(void *ptr)
+{
+    int k;
+    char buf[MSGSIZE];
+
+    for (k = 0; k < NUMSENDS; k++)
+        MPI_Recv(buf, MSGSIZE, MPI_CHAR, MPI_ANY_SOURCE, MPI_ANY_TAG,
+                 MPI_COMM_WORLD, MPI_STATUS_IGNORE);
+
+    return NULL;
+}
+
+
+void *sender_bsend(void *ptr)
+{
+    char buffer[MSGSIZE];
+    MPI_Bsend(buffer, MSGSIZE, MPI_CHAR, (rank + 1) % size, 0,
+              MPI_COMM_WORLD);
+    return NULL;
+}
+
+void *sender_ibsend(void *ptr)
+{
+    char buffer[MSGSIZE];
+    MPI_Request req;
+    MPI_Ibsend(buffer, MSGSIZE, MPI_CHAR, (rank + 1) % size, 0,
+               MPI_COMM_WORLD, &req);
+    MPI_Wait(&req, MPI_STATUS_IGNORE);
+
+    return NULL;
+}
+
+void *sender_isend(void *ptr)
+{
+    char buffer[MSGSIZE];
+    MPI_Request req;
+    MPI_Isend(buffer, MSGSIZE, MPI_CHAR, (rank + 1) % size, 0,
+              MPI_COMM_WORLD, &req);
+    MPI_Wait(&req, MPI_STATUS_IGNORE);
+    return NULL;
+}
+
+void *sender_send(void *ptr)
+{
+    char buffer[MSGSIZE];
+    MPI_Send(buffer, MSGSIZE, MPI_CHAR, (rank + 1) % size, 0,
+             MPI_COMM_WORLD);
+    return NULL;
+}
+
+int main(int argc, char *argv[])
+{
+
+    int provided, i[2], k;
+    char *buffer;
+    MPI_Status status;
+    pthread_t receiver_thread, sender_thread;
+    MPI_Comm communicator;
+    int bs;
+
+    MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &provided);
+
+    if (provided != MPI_THREAD_MULTIPLE) {
+        printf("Error\n");
+        MPI_Abort(911, MPI_COMM_WORLD);
+    }
+
+    MPI_Buffer_attach(malloc(BUFSIZE), BUFSIZE);
+
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+    MPI_Comm_size(MPI_COMM_WORLD, &size);
+    MPI_Comm_dup(MPI_COMM_WORLD, &communicator);        /* We do not use this communicator in this program, but
+                                                           with this call, the problem appears more reliably.
+                                                           If the MPI_Comm_dup() call is commented out, it is still
+                                                           evident but does not appear that often (don't know why) */
+
+    pthread_create(&receiver_thread, NULL, &receiver, NULL);
+    for (k = 0; k < NUMSENDS; k++)
+        pthread_create(&sender_thread, NULL, &sender_bsend, NULL);
+    pthread_join(receiver_thread, NULL);
+    for (k = 0; k < NUMSENDS; k++)
+        pthread_join(sender_thread, NULL);
+    MPI_Barrier(MPI_COMM_WORLD);
+
+    pthread_create(&receiver_thread, NULL, &receiver, NULL);
+    for (k = 0; k < NUMSENDS; k++)
+        pthread_create(&sender_thread, NULL, &sender_ibsend, NULL);
+    pthread_join(receiver_thread, NULL);
+    for (k = 0; k < NUMSENDS; k++)
+        pthread_join(sender_thread, NULL);
+    MPI_Barrier(MPI_COMM_WORLD);
+
+    pthread_create(&receiver_thread, NULL, &receiver, NULL);
+    for (k = 0; k < NUMSENDS; k++)
+        pthread_create(&sender_thread, NULL, &sender_isend, NULL);
+    pthread_join(receiver_thread, NULL);
+    for (k = 0; k < NUMSENDS; k++)
+        pthread_join(sender_thread, NULL);
+    MPI_Barrier(MPI_COMM_WORLD);
+
+    pthread_create(&receiver_thread, NULL, &receiver, NULL);
+    for (k = 0; k < NUMSENDS; k++)
+        pthread_create(&sender_thread, NULL, &sender_send, NULL);
+    pthread_join(receiver_thread, NULL);
+    for (k = 0; k < NUMSENDS; k++)
+        pthread_join(sender_thread, NULL);
+    MPI_Barrier(MPI_COMM_WORLD);
+
+    if (!rank)
+        printf( " No Errors\n" );
+
+    MPI_Comm_free(&communicator);
+    MPI_Buffer_detach(&buffer, &bs);
+    free(buffer);
+    MPI_Finalize();
+}
diff --git a/test/mpi/threads/pt2pt/testlist b/test/mpi/threads/pt2pt/testlist
index 760238f..ce8fc9c 100644
--- a/test/mpi/threads/pt2pt/testlist
+++ b/test/mpi/threads/pt2pt/testlist
@@ -8,3 +8,4 @@ multisend3 5
 multisend4 5
 greq_wait 1
 greq_test 1
+ibtest 2

-----------------------------------------------------------------------

Summary of changes:
 test/mpi/threads/pt2pt/Makefile.am |    2 +-
 test/mpi/threads/pt2pt/ibsend.c    |  156 ++++++++++++++++++++++++++++++++++++
 test/mpi/threads/pt2pt/testlist    |    1 +
 3 files changed, 158 insertions(+), 1 deletions(-)
 create mode 100644 test/mpi/threads/pt2pt/ibsend.c


hooks/post-receive
-- 
MPICH primary repository


More information about the commits mailing list