You can subscribe to this list here.
| 2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
(122) |
Nov
(152) |
Dec
(69) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2003 |
Jan
(6) |
Feb
(25) |
Mar
(73) |
Apr
(82) |
May
(24) |
Jun
(25) |
Jul
(10) |
Aug
(11) |
Sep
(10) |
Oct
(54) |
Nov
(203) |
Dec
(182) |
| 2004 |
Jan
(307) |
Feb
(305) |
Mar
(430) |
Apr
(312) |
May
(187) |
Jun
(342) |
Jul
(487) |
Aug
(637) |
Sep
(336) |
Oct
(373) |
Nov
(441) |
Dec
(210) |
| 2005 |
Jan
(385) |
Feb
(480) |
Mar
(636) |
Apr
(544) |
May
(679) |
Jun
(625) |
Jul
(810) |
Aug
(838) |
Sep
(634) |
Oct
(521) |
Nov
(965) |
Dec
(543) |
| 2006 |
Jan
(494) |
Feb
(431) |
Mar
(546) |
Apr
(411) |
May
(406) |
Jun
(322) |
Jul
(256) |
Aug
(401) |
Sep
(345) |
Oct
(542) |
Nov
(308) |
Dec
(481) |
| 2007 |
Jan
(427) |
Feb
(326) |
Mar
(367) |
Apr
(255) |
May
(244) |
Jun
(204) |
Jul
(223) |
Aug
(231) |
Sep
(354) |
Oct
(374) |
Nov
(497) |
Dec
(362) |
| 2008 |
Jan
(322) |
Feb
(482) |
Mar
(658) |
Apr
(422) |
May
(476) |
Jun
(396) |
Jul
(455) |
Aug
(267) |
Sep
(280) |
Oct
(253) |
Nov
(232) |
Dec
(304) |
| 2009 |
Jan
(486) |
Feb
(470) |
Mar
(458) |
Apr
(423) |
May
(696) |
Jun
(461) |
Jul
(551) |
Aug
(575) |
Sep
(134) |
Oct
(110) |
Nov
(157) |
Dec
(102) |
| 2010 |
Jan
(226) |
Feb
(86) |
Mar
(147) |
Apr
(117) |
May
(107) |
Jun
(203) |
Jul
(193) |
Aug
(238) |
Sep
(300) |
Oct
(246) |
Nov
(23) |
Dec
(75) |
| 2011 |
Jan
(133) |
Feb
(195) |
Mar
(315) |
Apr
(200) |
May
(267) |
Jun
(293) |
Jul
(353) |
Aug
(237) |
Sep
(278) |
Oct
(611) |
Nov
(274) |
Dec
(260) |
| 2012 |
Jan
(303) |
Feb
(391) |
Mar
(417) |
Apr
(441) |
May
(488) |
Jun
(655) |
Jul
(590) |
Aug
(610) |
Sep
(526) |
Oct
(478) |
Nov
(359) |
Dec
(372) |
| 2013 |
Jan
(467) |
Feb
(226) |
Mar
(391) |
Apr
(281) |
May
(299) |
Jun
(252) |
Jul
(311) |
Aug
(352) |
Sep
(481) |
Oct
(571) |
Nov
(222) |
Dec
(231) |
| 2014 |
Jan
(185) |
Feb
(329) |
Mar
(245) |
Apr
(238) |
May
(281) |
Jun
(399) |
Jul
(382) |
Aug
(500) |
Sep
(579) |
Oct
(435) |
Nov
(487) |
Dec
(256) |
| 2015 |
Jan
(338) |
Feb
(357) |
Mar
(330) |
Apr
(294) |
May
(191) |
Jun
(108) |
Jul
(142) |
Aug
(261) |
Sep
(190) |
Oct
(54) |
Nov
(83) |
Dec
(22) |
| 2016 |
Jan
(49) |
Feb
(89) |
Mar
(33) |
Apr
(50) |
May
(27) |
Jun
(34) |
Jul
(53) |
Aug
(53) |
Sep
(98) |
Oct
(206) |
Nov
(93) |
Dec
(53) |
| 2017 |
Jan
(65) |
Feb
(82) |
Mar
(102) |
Apr
(86) |
May
(187) |
Jun
(67) |
Jul
(23) |
Aug
(93) |
Sep
(65) |
Oct
(45) |
Nov
(35) |
Dec
(17) |
| 2018 |
Jan
(26) |
Feb
(35) |
Mar
(38) |
Apr
(32) |
May
(8) |
Jun
(43) |
Jul
(27) |
Aug
(30) |
Sep
(43) |
Oct
(42) |
Nov
(38) |
Dec
(67) |
| 2019 |
Jan
(32) |
Feb
(37) |
Mar
(53) |
Apr
(64) |
May
(49) |
Jun
(18) |
Jul
(14) |
Aug
(53) |
Sep
(25) |
Oct
(30) |
Nov
(49) |
Dec
(31) |
| 2020 |
Jan
(87) |
Feb
(45) |
Mar
(37) |
Apr
(51) |
May
(99) |
Jun
(36) |
Jul
(11) |
Aug
(14) |
Sep
(20) |
Oct
(24) |
Nov
(40) |
Dec
(23) |
| 2021 |
Jan
(14) |
Feb
(53) |
Mar
(85) |
Apr
(15) |
May
(19) |
Jun
(3) |
Jul
(14) |
Aug
(1) |
Sep
(57) |
Oct
(73) |
Nov
(56) |
Dec
(22) |
| 2022 |
Jan
(3) |
Feb
(22) |
Mar
(6) |
Apr
(55) |
May
(46) |
Jun
(39) |
Jul
(15) |
Aug
(9) |
Sep
(11) |
Oct
(34) |
Nov
(20) |
Dec
(36) |
| 2023 |
Jan
(79) |
Feb
(41) |
Mar
(99) |
Apr
(169) |
May
(48) |
Jun
(16) |
Jul
(16) |
Aug
(57) |
Sep
(19) |
Oct
|
Nov
|
Dec
|
| S | M | T | W | T | F | S |
|---|---|---|---|---|---|---|
|
|
|
|
1
(23) |
2
(40) |
3
(17) |
4
(10) |
|
5
(14) |
6
(41) |
7
(26) |
8
(23) |
9
(15) |
10
(25) |
11
(14) |
|
12
(23) |
13
(11) |
14
(18) |
15
(21) |
16
(18) |
17
(8) |
18
(14) |
|
19
(16) |
20
(15) |
21
(12) |
22
(11) |
23
(8) |
24
(11) |
25
(12) |
|
26
(9) |
27
(17) |
28
(31) |
29
(16) |
30
(10) |
31
(17) |
|
|
From: <sv...@va...> - 2006-03-10 22:18:01
|
Author: sewardj
Date: 2006-03-10 22:17:57 +0000 (Fri, 10 Mar 2006)
New Revision: 5743
Log:
Quadrics MPI build fixes.
Modified:
trunk/auxprogs/mpiwrap.c
Modified: trunk/auxprogs/mpiwrap.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/auxprogs/mpiwrap.c 2006-03-10 22:17:02 UTC (rev 5742)
+++ trunk/auxprogs/mpiwrap.c 2006-03-10 22:17:57 UTC (rev 5743)
@@ -394,8 +394,12 @@
if (ty =3D=3D MPI_BYTE) return 1;
/* MPI_PACKED */
/* new in MPI2: */
+# if defined(MPI_WCHAR)
if (ty =3D=3D MPI_WCHAR) return sizeof(wchar_t);
+# endif
+# if defined(MPI_SIGNED_CHAR)
if (ty =3D=3D MPI_SIGNED_CHAR) return sizeof(signed char);
+# endif
if (ty =3D=3D MPI_UNSIGNED_LONG_LONG) return sizeof(unsigned long lon=
g int);
if (ty =3D=3D MPI_LONG_LONG_INT) return sizeof(signed long long =
int);
/* Note: the following are named structs, not named basic types,
@@ -467,6 +471,8 @@
f(base + offsetof(Ty,loc), sizeof(int));
return;
}
+ if (ty =3D=3D MPI_LB || ty =3D=3D MPI_UB)
+ return; /* have zero size, so nothing needs to be done */
goto unhandled;
/*NOTREACHED*/
}
|
|
From: <sv...@va...> - 2006-03-10 22:17:08
|
Author: sewardj Date: 2006-03-10 22:17:02 +0000 (Fri, 10 Mar 2006) New Revision: 5742 Log: Make sure we get the right headers, not whatever happens to be already installed. Modified: trunk/auxprogs/mpiwrap_type_test.c Modified: trunk/auxprogs/mpiwrap_type_test.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- trunk/auxprogs/mpiwrap_type_test.c 2006-03-10 21:48:29 UTC (rev 5741) +++ trunk/auxprogs/mpiwrap_type_test.c 2006-03-10 22:17:02 UTC (rev 5742) @@ -11,7 +11,7 @@ #include <assert.h> #include <dlfcn.h> #include "mpi.h" -#include "valgrind/memcheck.h" +#include "../memcheck/memcheck.h" =20 typedef MPI_Datatype Ty; =20 |
|
From: <sv...@va...> - 2006-03-10 21:48:32
|
Author: sewardj
Date: 2006-03-10 21:48:29 +0000 (Fri, 10 Mar 2006)
New Revision: 5741
Log:
Add a (rather ingenious, if I do say so myself) program to test the
type-walking stuff in mpiwrap.c.
Added:
trunk/auxprogs/mpiwrap_type_test.c
Modified:
trunk/auxprogs/Makefile.am
Modified: trunk/auxprogs/Makefile.am
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/auxprogs/Makefile.am 2006-03-10 21:41:01 UTC (rev 5740)
+++ trunk/auxprogs/Makefile.am 2006-03-10 21:48:29 UTC (rev 5741)
@@ -5,7 +5,7 @@
=20
noinst_SCRIPTS =3D gen-mdg DotToScc.hs primes.c \
gsl16test gsl16-badfree.patch gsl16-wavelet.patch \
- ppcfround.c ppc64shifts.c mpiwrap.c
+ ppcfround.c ppc64shifts.c mpiwrap.c mpiwrap_type_test.c
=20
EXTRA_DIST =3D $(noinst_SCRIPTS)
=20
Added: trunk/auxprogs/mpiwrap_type_test.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/auxprogs/mpiwrap_type_test.c (rev 0)
+++ trunk/auxprogs/mpiwrap_type_test.c 2006-03-10 21:48:29 UTC (rev 5741)
@@ -0,0 +1,295 @@
+
+/* A test program to check whether the type-traversal functions in
+ mpiwrap.c (walk_type, walk_type_array) are correct. It does this
+ by sending a message to itself, thereby discovering what areas of
+ memory the MPI implementation itself believe constitute the type.
+ It then gets walk_type to enumerate the type, and compares the
+ results. */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <dlfcn.h>
+#include "mpi.h"
+#include "valgrind/memcheck.h"
+
+typedef MPI_Datatype Ty;
+
+typedef unsigned char Bool;
+#define False ((Bool)0)
+#define True ((Bool)1)
+
+static Ty tycon_Contiguous ( int count, Ty t )
+{
+ Ty t2; =20
+ int r =3D MPI_Type_contiguous( count, t, &t2 );
+ assert(r =3D=3D MPI_SUCCESS);
+ return t2;
+}
+
+static Ty tycon_Struct2 ( int d1, int copies1, Ty t1,
+ int d2, int copies2, Ty t2 )
+{
+ int blocklens[2];
+ MPI_Aint disps[2];
+ Ty tys[2];
+ Ty tres;
+ int r;
+ blocklens[0] =3D copies1;
+ blocklens[1] =3D copies2;
+ disps[0] =3D d1;
+ disps[1] =3D d2;
+ tys[0] =3D t1;
+ tys[1] =3D t2;
+ r =3D MPI_Type_struct( 2, blocklens, disps, tys, &tres );
+ assert(r =3D=3D MPI_SUCCESS);
+ return tres;
+}
+
+static Ty tycon_Vector ( int count, int blocklen, int stride, Ty t )
+{
+ Ty tres;
+ int r;
+ r =3D MPI_Type_vector( count, blocklen, stride, t, &tres );
+ assert(r =3D=3D MPI_SUCCESS);
+ return tres;
+}
+
+static Ty tycon_HVector ( int count, int blocklen, MPI_Aint stride, Ty t=
)
+{
+ Ty tres;
+ int r;
+ r =3D MPI_Type_hvector( count, blocklen, stride, t, &tres );
+ assert(r =3D=3D MPI_SUCCESS);
+ return tres;
+}
+
+static Ty tycon_Indexed2 ( int d1, int copies1,=20
+ int d2, int copies2, Ty t )
+{
+ int blocklens[2];
+ int disps[2];
+ Ty tres;
+ int r;
+ blocklens[0] =3D copies1;
+ blocklens[1] =3D copies2;
+ disps[0] =3D d1;
+ disps[1] =3D d2;
+ r =3D MPI_Type_indexed( 2, blocklens, disps, t, &tres );
+ assert(r =3D=3D MPI_SUCCESS);
+ return tres;
+}
+
+static Ty tycon_HIndexed2 ( MPI_Aint d1, int copies1,=20
+ MPI_Aint d2, int copies2, Ty t )
+{
+ int blocklens[2];
+ MPI_Aint disps[2];
+ Ty tres;
+ int r;
+ blocklens[0] =3D copies1;
+ blocklens[1] =3D copies2;
+ disps[0] =3D d1;
+ disps[1] =3D d2;
+ r =3D MPI_Type_hindexed( 2, blocklens, disps, t, &tres );
+ assert(r =3D=3D MPI_SUCCESS);
+ return tres;
+}
+
+//////////////////////////////////////
+
+char characterise ( unsigned char b )
+{
+ if (b =3D=3D 0x00) return 'D';
+ if (b =3D=3D 0xFF) return '.';
+ return '?';
+}
+
+void sendToMyself_callback( void* v, long n )
+{
+ long i;
+ unsigned char* p =3D (unsigned char*)v;
+ if (0) printf("callback: %p %ld\n", v, n);
+ for (i =3D 0; i < n; i++)
+ p[i] =3D 0x00;
+}
+
+void sendToMyself ( Bool commit_free, Ty* tyP, char* name )
+{
+ int i;
+ MPI_Aint lb, ub, ex;
+ MPI_Request req;
+ MPI_Status status;
+ char* sbuf;
+ char* rbuf;
+ char* rbuf_walk;
+ int r;
+
+ void* dl_handle =3D NULL;
+
+ /* C: what a fabulous functional programming language :-) */
+ void(*dl_walk_type)(void(*)(void*,long),char*,MPI_Datatype) =3D NULL;
+
+ /* NULL: gives a handle which is RTLD_GLOBAL syms in current
+ process image */
+ dl_handle =3D dlopen(NULL, RTLD_LAZY);
+ if (!dl_handle) {
+ printf("sendToMyself: can't dlopen current process image\n");
+ return;
+ }
+ dl_walk_type =3D dlsym(dl_handle, "mpiwrap_walk_type_EXTERNALLY_VISIB=
LE");
+ if (!dl_walk_type) {
+ printf("sendToMyself: can't find mpiwrap_walk_type_EXTERNALLY_VISI=
BLE"
+ " in current process image\n");
+ dlclose(dl_handle);
+ return;
+ }
+
+ printf("\nsendToMyself: trying %s\n", name);
+
+ if (commit_free) {
+ r =3D MPI_Type_commit( tyP );
+ assert(r =3D=3D MPI_SUCCESS);
+ }
+
+ r =3D MPI_Type_lb( *tyP, &lb );
+ assert(r =3D=3D MPI_SUCCESS);
+ r =3D MPI_Type_ub( *tyP, &ub );
+ assert(r =3D=3D MPI_SUCCESS);
+ r =3D MPI_Type_extent( *tyP, &ex );
+ assert(r =3D=3D MPI_SUCCESS);
+ printf("sendToMyself: ex=3D%d (%d,%d)\n", (int)ex, (int)lb, (int)ub);
+ assert(lb >=3D 0);
+
+ /* Fill send buffer with zeroes */
+ sbuf =3D malloc(ub);
+ assert(sbuf);
+ for (i =3D 0; i < ub; i++)
+ sbuf[i] =3D 0;
+
+ r =3D MPI_Isend( sbuf,1,*tyP, 0,99,MPI_COMM_WORLD, &req);
+ assert(r =3D=3D MPI_SUCCESS);
+
+ /* Fill recv buffer with 0xFFs */
+ rbuf =3D malloc(ub);
+ assert(rbuf);
+ for (i =3D 0; i < ub; i++)
+ rbuf[i] =3D 0xFF;
+
+ r =3D MPI_Recv( rbuf,1,*tyP, 0,99,MPI_COMM_WORLD, &status);
+ assert(r =3D=3D MPI_SUCCESS);
+
+ /* Now: rbuf should contain 0x00s where data was transferred and
+ undefined 0xFFs where data was not transferred. Get
+ libmpiwrap.so to walk the transferred type, using the callback
+ to set to 0x00 all parts of rbuf_walk it considers part of the
+ type. */
+
+ rbuf_walk =3D malloc(ub);
+ assert(rbuf_walk);
+ for (i =3D 0; i < ub; i++)
+ rbuf_walk[i] =3D 0xFF;
+
+ dl_walk_type( sendToMyself_callback, rbuf_walk, *tyP );
+
+ dlclose(dl_handle);
+ if (commit_free) {
+ r =3D MPI_Type_free( tyP );
+ assert(r =3D=3D MPI_SUCCESS);
+ }
+
+ for (i =3D 0; i < ub; i++) {
+ if (rbuf_walk[i] =3D=3D rbuf[i])
+ continue; /* ok */
+ else
+ break; /* discrepancy */
+ }
+
+ if (i =3D=3D ub)
+ printf("SUCCESS\n");
+ else
+ printf("FAILED\n");
+
+ for (i =3D 0; i < ub; i++)
+ printf("%c", characterise(rbuf_walk[i]));
+ printf("\n");
+
+ for (i =3D 0; i < ub; i++)
+ printf("%c", characterise(rbuf[i]));
+ printf("\n");
+}
+
+
+typedef char* Nm;
+
+int main ( int argc, char** argv )
+{
+ int rank, size;
+
+ if (!RUNNING_ON_VALGRIND) {
+ printf("error: this program must be run on valgrind\n");
+ return 1;
+ }
+
+ MPI_Init( &argc, &argv );
+ MPI_Comm_size( MPI_COMM_WORLD, &size );
+ MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+
+ if (rank =3D=3D 0) {
+
+ Ty t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13;
+ Nm n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, n13;
+
+ t2 =3D tycon_Contiguous(3, MPI_INT);
+ n2 =3D "Contig{3xINT}";
+
+ t3 =3D tycon_Struct2(3,2,MPI_CHAR, 8,1,MPI_DOUBLE);
+ n3 =3D "Struct{h3:2xCHAR, h8:1xDOUBLE}";
+
+ t4 =3D tycon_Struct2(0,1,MPI_CHAR, 8,1,tycon_Contiguous(4, MPI_DOUBL=
E));
+ n4 =3D "Struct{h0:1xCHAR, h8:1xContig{4xDOUBLE}}";
+
+ t5 =3D tycon_Contiguous(10, tycon_Struct2(1,1,MPI_CHAR, 4,1,MPI_FLOA=
T));
+ n5 =3D "Contig{10xStruct{h1:1xCHAR, h4:1xFLOAT}}";
+
+ t6 =3D tycon_Vector(5, 2,3,MPI_DOUBLE);
+ n6 =3D "Vector{5x(2,3)xDOUBLE}";
+
+ t7 =3D tycon_Vector(3, 1,2,MPI_LONG_DOUBLE);
+ n7 =3D "Vector{3x(1,2)xLONG_DOUBLE}";
+
+ t8 =3D tycon_HVector(4, 1,3,MPI_SHORT);
+ n8 =3D "HVector{4x(1,h3)xSHORT}";
+
+ t9 =3D tycon_Indexed2(1,3, 5,2, MPI_UNSIGNED_CHAR);
+ n9 =3D "Indexed{1:3x,5:2x,UNSIGNED_CHAR}";
+
+ t10 =3D tycon_HIndexed2(1,2, 6,3, MPI_UNSIGNED_SHORT);
+ n10 =3D "HIndexed{h1:2x,h6:3x,UNSIGNED_SHORT}";
+
+ t11 =3D MPI_LONG_INT;
+ n11 =3D "LONG_INT";
+
+ t12 =3D MPI_DOUBLE_INT;
+ n12 =3D "DOUBLE_INT";
+
+ t13 =3D MPI_SHORT_INT;
+ n13 =3D "SHORT_INT";
+
+ sendToMyself(True, &t2, n2);
+ sendToMyself(True, &t3, n3);
+ sendToMyself(True, &t4, n4);
+ sendToMyself(True, &t5, n5);
+ sendToMyself(True, &t6, n6);
+ sendToMyself(True, &t7, n7);
+ sendToMyself(True, &t8, n8);
+ sendToMyself(True, &t9, n9);
+ sendToMyself(True, &t10, n10);
+ sendToMyself(False, &t11, n11);
+ sendToMyself(False, &t12, n12);
+ sendToMyself(False, &t13, n13);
+ }
+
+ MPI_Finalize();
+ return 0;
+}
|
|
From: <sv...@va...> - 2006-03-10 21:41:08
|
Author: sewardj
Date: 2006-03-10 21:41:01 +0000 (Fri, 10 Mar 2006)
New Revision: 5740
Log:
Even more MPI wrappers.
Modified:
trunk/auxprogs/mpiwrap.c
Modified: trunk/auxprogs/mpiwrap.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/auxprogs/mpiwrap.c 2006-03-10 18:37:45 UTC (rev 5739)
+++ trunk/auxprogs/mpiwrap.c 2006-03-10 21:41:01 UTC (rev 5740)
@@ -1078,8 +1078,8 @@
&& request_after =3D=3D MPI_REQUEST_NULL
&& (error_in_status ? status->MPI_ERROR =3D=3D MPI_SUCCESS : True=
)
&& ( (shadow=3Dfind_shadow_Request(request_before)) !=3D NULL) ) =
{
- /* The Irecv detailed in 'shadow' completed. Make the result
- buffer, and delete the entry. */
+ /* The Irecv detailed in 'shadow' completed. Paint the result
+ buffer, and delete the entry. */
if (count_from_Status(&recv_count, shadow->datatype, status)) {
make_defined(shadow->buf, recv_count, shadow->datatype);
if (opt_verbosity > 1)
@@ -1158,6 +1158,11 @@
}
=20
/* --- Wait --- */
+/* The MPI1 spec (imprecisely) defines 3 request states:
+ - "null" if the request is MPI_REQUEST_NULL
+ - "inactive" if not "null" and not associated with ongoing comms
+ - "active" if not "null" and is associated with ongoing comms
+*/
int WRAPPER_FOR(PMPI_Wait)( MPI_Request* request,
MPI_Status* status )
{
@@ -1167,8 +1172,7 @@
VALGRIND_GET_ORIG_FN(fn);
before("Wait");
check_writable_untyped(status, sizeof(MPI_Status));
- if (*request !=3D MPI_REQUEST_NULL)
- check_readable_untyped(request, sizeof(MPI_Request));
+ check_readable_untyped(request, sizeof(MPI_Request));
request_before =3D *request;
CALL_FN_W_WW(err, fn, request,status);
if (err =3D=3D MPI_SUCCESS) {
@@ -1193,8 +1197,7 @@
if (0) fprintf(stderr, "Waitall: %d\n", count);
for (i =3D 0; i < count; i++) {
check_writable_untyped(&statuses[i], sizeof(MPI_Status));
- if (requests[i] !=3D MPI_REQUEST_NULL)
- check_readable_untyped(&requests[i], sizeof(MPI_Request));
+ check_readable_untyped(&requests[i], sizeof(MPI_Request));
}
requests_before =3D clone_Request_array( count, requests );
CALL_FN_W_WWW(err, fn, count,requests,statuses);
@@ -1213,12 +1216,69 @@
return err;
}
=20
+/* --- Test --- */
+/* nonblocking version of Wait */
+int WRAPPER_FOR(PMPI_Test)( MPI_Request* request, int* flag,=20
+ MPI_Status* status )
+{
+ MPI_Request request_before;
+ OrigFn fn;
+ int err;
+ VALGRIND_GET_ORIG_FN(fn);
+ before("Test");
+ check_writable_untyped(status, sizeof(MPI_Status));
+ check_writable_untyped(flag, sizeof(int));
+ check_readable_untyped(request, sizeof(MPI_Request));
+ request_before =3D *request;
+ CALL_FN_W_WWW(err, fn, request,flag,status);
+ if (err =3D=3D MPI_SUCCESS && *flag) {
+ maybe_complete(False/*err in status?*/,=20
+ request_before, *request, status);
+ make_defined_untyped(status, sizeof(MPI_Status));
+ }
+ after("Test", err);
+ return err;
+}
+
+/* --- Testall --- */
+/* nonblocking version of Waitall */
+int WRAPPER_FOR(PMPI_Testall)( int count, MPI_Request* requests,
+ int* flag, MPI_Status* statuses )
+{
+ MPI_Request* requests_before =3D NULL;
+ OrigFn fn;
+ int err, i;
+ VALGRIND_GET_ORIG_FN(fn);
+ before("Testall");
+ if (0) fprintf(stderr, "Testall: %d\n", count);
+ check_writable_untyped(flag, sizeof(int));
+ for (i =3D 0; i < count; i++) {
+ check_writable_untyped(&statuses[i], sizeof(MPI_Status));
+ check_readable_untyped(&requests[i], sizeof(MPI_Request));
+ }
+ requests_before =3D clone_Request_array( count, requests );
+ CALL_FN_W_WWWW(err, fn, count,requests,flag,statuses);
+ /* Urk. Is the following "if (...)" really right? I don't know. */
+ if (*flag
+ && (err =3D=3D MPI_SUCCESS /*complete success*/
+ || err =3D=3D MPI_ERR_IN_STATUS /* partial success */)) {
+ Bool e_i_s =3D err =3D=3D MPI_ERR_IN_STATUS;
+ for (i =3D 0; i < count; i++) {
+ maybe_complete(e_i_s, requests_before[i], requests[i],=20
+ &statuses[i]);
+ make_defined_untyped(&statuses[i], sizeof(MPI_Status));
+ }
+ }
+ if (requests_before)
+ free(requests_before);
+ after("Testall", err);
+ return err;
+}
+
/* --- Iprobe --- */
-/* very unclear about this */
/* pre: must-be-writable: *flag, *status */
/* post: make-readable *flag
- if *flag=3D=3DTrue make-readable *status
- if *flag=3D=3DFalse make-uninitialised *status */
+ if *flag=3D=3DTrue make-defined *status */
int WRAPPER_FOR(PMPI_Iprobe)(int source, int tag,=20
MPI_Comm comm,=20
int* flag, MPI_Status* status)
@@ -1234,14 +1294,49 @@
make_defined_untyped(flag, sizeof(*flag));
if (*flag)
make_defined_untyped(status, sizeof(*status));
- else
- make_writable_untyped(status, sizeof(*status));
}
after("Iprobe", err);
return err;
}
=20
+/* --- Probe --- */
+/* pre: must-be-writable *status */
+/* post: make-defined *status */
+int WRAPPER_FOR(PMPI_Probe)(int source, int tag,
+ MPI_Comm comm, MPI_Status* status)
+{
+ OrigFn fn;
+ int err;
+ VALGRIND_GET_ORIG_FN(fn);
+ before("Probe");
+ check_writable_untyped(status, sizeof(*status));
+ CALL_FN_W_WWWW(err, fn, source,tag,comm,status);
+ make_defined_if_success_untyped(err, status, sizeof(*status));
+ after("Probe", err);
+ return err;
+}
=20
+/* --- Cancel --- */
+/* Wrapping PMPI_Cancel is interesting only to the extent that we need
+ to be able to detect when a request should be removed from our
+ shadow table due to cancellation. */
+int WRAPPER_FOR(PMPI_Cancel)(MPI_Request* request)
+{
+ OrigFn fn;
+ int err;
+ MPI_Request tmp;
+ VALGRIND_GET_ORIG_FN(fn);
+ before("Cancel");
+ check_writable_untyped(request, sizeof(*request));
+ tmp =3D *request;
+ CALL_FN_W_W(err, fn, request);
+ if (err =3D=3D MPI_SUCCESS)
+ delete_shadow_Request(tmp);
+ after("Cancel", err);
+ return err;
+}
+
+
/*------------------------------------------------------------*/
/*--- ---*/
/*--- Sec 3.10, Send-receive ---*/
@@ -1397,7 +1492,8 @@
CALL_FN_W_8W(err, fn, sendbuf,sendcount,sendtype,
recvbuf,recvcount,recvtype,
root,comm);
- make_defined_if_success(err, recvbuf, recvcount * sz, recvtype);
+ if (me =3D=3D root)
+ make_defined_if_success(err, recvbuf, recvcount * sz, recvtype);
after("Gather", err);
return err;
}
@@ -1405,6 +1501,70 @@
=20
/*------------------------------------------------------------*/
/*--- ---*/
+/*--- Sec 4.6, Scatter ---*/
+/*--- ---*/
+/*------------------------------------------------------------*/
+
+/* pre: (root only): must be readable: (sendbuf,sendcount * comm_size,s=
endtype)
+ (all): must be writable: (recvbuf,recvbuf,recvtype)
+ post: (all): make defined: (recvbuf,recvbuf,recvtype)
+*/
+int WRAPPER_FOR(PMPI_Scatter)(
+ void* sendbuf, int sendcount, MPI_Datatype sendtype,
+ void* recvbuf, int recvcount, MPI_Datatype recvtype,
+ int root, MPI_Comm comm)
+{
+ OrigFn fn;
+ int err, me, sz;
+ VALGRIND_GET_ORIG_FN(fn);
+ before("Scatter");
+ me =3D comm_rank(comm);
+ sz =3D comm_size(comm);
+ check_writable(recvbuf, recvcount, recvtype);
+ if (me =3D=3D root)
+ check_readable(sendbuf, sendcount * sz, sendtype);
+ CALL_FN_W_8W(err, fn, sendbuf,sendcount,sendtype,
+ recvbuf,recvcount,recvtype,
+ root,comm);
+ make_defined_if_success(err, recvbuf, recvcount, recvtype);
+ after("Scatter", err);
+ return err;
+}
+
+
+/*------------------------------------------------------------*/
+/*--- ---*/
+/*--- Sec 4.8, All-to-All Scatter/Gather ---*/
+/*--- ---*/
+/*------------------------------------------------------------*/
+
+/* pre: (all) must be readable: (sendbuf,sendcount * comm_size,sendtype=
)
+ (all) must be writable: (recvbuf,recvcount * comm_size,recvtype=
)
+ post: (all) make defined: (recvbuf,recvcount * comm_size,recvtype=
)
+*/
+int WRAPPER_FOR(PMPI_Alltoall)(
+ void* sendbuf, int sendcount, MPI_Datatype sendtype,
+ void* recvbuf, int recvcount, MPI_Datatype recvtype,
+ MPI_Comm comm)
+{
+ OrigFn fn;
+ int err, sz;
+ VALGRIND_GET_ORIG_FN(fn);
+ before("Alltoall");
+ sz =3D comm_size(comm);
+ check_readable(sendbuf, sendcount * sz, sendtype);
+ check_writable(recvbuf, recvcount * sz, recvtype);
+ CALL_FN_W_7W(err, fn, sendbuf,sendcount,sendtype,
+ recvbuf,recvcount,recvtype,
+ comm);
+ make_defined_if_success(err, recvbuf, recvcount * sz, recvtype);
+ after("Alltoall", err);
+ return err;
+}
+
+
+/*------------------------------------------------------------*/
+/*--- ---*/
/*--- Sec 4.9, Global Reduction Operations ---*/
/*--- ---*/
/*------------------------------------------------------------*/
@@ -1792,7 +1952,7 @@
DEFAULT_WRAPPER_W_8W(Allgatherv)
DEFAULT_WRAPPER_W_3W(Alloc_mem)
/* DEFAULT_WRAPPER_W_6W(Allreduce) */
-DEFAULT_WRAPPER_W_7W(Alltoall)
+/* DEFAULT_WRAPPER_W_7W(Alltoall) */
DEFAULT_WRAPPER_W_9W(Alltoallv)
DEFAULT_WRAPPER_W_9W(Alltoallw)
DEFAULT_WRAPPER_W_2W(Attr_delete)
@@ -1804,7 +1964,7 @@
DEFAULT_WRAPPER_W_7W(Bsend_init)
DEFAULT_WRAPPER_W_2W(Buffer_attach)
DEFAULT_WRAPPER_W_2W(Buffer_detach)
-DEFAULT_WRAPPER_W_1W(Cancel)
+/* DEFAULT_WRAPPER_W_1W(Cancel) */
DEFAULT_WRAPPER_W_4W(Cart_coords)
DEFAULT_WRAPPER_W_6W(Cart_create)
DEFAULT_WRAPPER_W_5W(Cart_get)
@@ -1981,7 +2141,7 @@
DEFAULT_WRAPPER_W_7W(Pack)
DEFAULT_WRAPPER_W_4W(Pack_size)
/* int MPI_Pcontrol(const int level, ...) */
-DEFAULT_WRAPPER_W_4W(Probe)
+/* DEFAULT_WRAPPER_W_4W(Probe) */
DEFAULT_WRAPPER_W_3W(Publish_name)
DEFAULT_WRAPPER_W_8W(Put)
DEFAULT_WRAPPER_W_1W(Query_thread)
@@ -1997,7 +2157,7 @@
/* DEFAULT_WRAPPER_W_6W(Rsend) */
DEFAULT_WRAPPER_W_7W(Rsend_init)
DEFAULT_WRAPPER_W_6W(Scan)
-DEFAULT_WRAPPER_W_8W(Scatter)
+/* DEFAULT_WRAPPER_W_8W(Scatter) */
DEFAULT_WRAPPER_W_9W(Scatterv)
DEFAULT_WRAPPER_W_7W(Send_init)
/* DEFAULT_WRAPPER_W_6W(Send) */
@@ -2011,9 +2171,9 @@
DEFAULT_WRAPPER_W_2W(Status_f2c)
DEFAULT_WRAPPER_W_2W(Status_set_cancelled)
DEFAULT_WRAPPER_W_3W(Status_set_elements)
-DEFAULT_WRAPPER_W_4W(Testall)
+/* DEFAULT_WRAPPER_W_4W(Testall) */
DEFAULT_WRAPPER_W_5W(Testany)
-DEFAULT_WRAPPER_W_3W(Test)
+/* DEFAULT_WRAPPER_W_3W(Test) */
DEFAULT_WRAPPER_W_2W(Test_cancelled)
DEFAULT_WRAPPER_W_5W(Testsome)
DEFAULT_WRAPPER_W_2W(Topo_test)
|
|
From: <sv...@va...> - 2006-03-10 18:37:54
|
Author: sewardj
Date: 2006-03-10 18:37:45 +0000 (Fri, 10 Mar 2006)
New Revision: 5739
Log:
Add a bunch more wrappers and generally tidy up a bit.
Modified:
trunk/auxprogs/mpiwrap.c
Modified: trunk/auxprogs/mpiwrap.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/auxprogs/mpiwrap.c 2006-03-10 14:51:19 UTC (rev 5738)
+++ trunk/auxprogs/mpiwrap.c 2006-03-10 18:37:45 UTC (rev 5739)
@@ -59,11 +59,6 @@
=20
=20
/*------------------------------------------------------------*/
-/*--- ---*/
-/*------------------------------------------------------------*/
-
-
-/*------------------------------------------------------------*/
/*--- includes ---*/
/*------------------------------------------------------------*/
=20
@@ -130,7 +125,7 @@
static Bool opt_missing =3D 0; /* 0:silent; 1:warn; 2:abort */
static Bool opt_help =3D False;
=20
-static inline void before ( char* fnname )
+static void before ( char* fnname )
{
/* This isn't thread-safe wrt 'done' (no locking). It's not
critical. */
@@ -438,7 +433,7 @@
if (0)
printf("walk_type %p\n", (void*)ty);
=20
- r =3D MPI_Type_get_envelope( ty, &n_ints, &n_addrs, &n_dtys, &tycon )=
;
+ r =3D PMPI_Type_get_envelope( ty, &n_ints, &n_addrs, &n_dtys, &tycon =
);
assert(r =3D=3D MPI_SUCCESS);
=20
/* Handle the base cases fast(er/ish). */
@@ -500,8 +495,8 @@
assert(dtys);
}
=20
- r =3D MPI_Type_get_contents( ty, n_ints, n_addrs, n_dtys,
- ints, addrs, dtys );
+ r =3D PMPI_Type_get_contents( ty, n_ints, n_addrs, n_dtys,
+ ints, addrs, dtys );
assert(r =3D=3D MPI_SUCCESS);
=20
switch (tycon) {
@@ -773,29 +768,18 @@
/*--- Interface Standard, MPIF, Nov 15 2003" (the MPI 1.1 ---*/
/*--- spec. All unimplemented wrappers are listed at the ---*/
/*--- end of the file. The list of function names is ---*/
-/*--- taken from the headers of lampi-1.5.12. Hopefully ---*/
-/*--- it is a complete list of all the MPI 1.1 functions. ---*/
+/*--- taken from the headers of Open MPI svn r9191. ---*/
+/*--- Hopefully it is a complete list of all the MPI 2 ---*/
+/*--- functions. ---*/
/*--- ---*/
/*------------------------------------------------------------*/
=20
/* Handy abbreviation */
#define WRAPPER_FOR(name) I_WRAP_FNNAME_U(name)
=20
-/* Generates a wrapper which aborts when called. */
-#define UNIMPLEMENTED_WRAPPER(name) \
- void I_WRAP_FNNAME_U(PMPI_##name) ( void ) \
- { \
- fprintf(stderr, "%s %5d: UNIMPLEMENTED wrapper: " \
- "PMPI_%s\n", \
- preamble, my_pid, #name); \
- fprintf(stderr, "%s %5d: exiting now.\n", \
- preamble, my_pid); \
- exit(1); \
- }
-
/* Generates (conceptually) a wrapper which does nothing. In
fact just generate no wrapper at all. */
-#define NO_OP_WRAPPER(name) /* */
+#define HAS_NO_WRAPPER(basename) /* */
=20
=20
/*------------------------------------------------------------*/
@@ -804,20 +788,37 @@
/*--- ---*/
/*------------------------------------------------------------*/
=20
-/* --- Send --- */
+/* --- {,B,S,R}Send --- */
/* pre: rd: (buf,count,datatype) */
-int WRAPPER_FOR(PMPI_Send)(void *buf, int count, MPI_Datatype datatype,=20
- int dest, int tag, MPI_Comm comm)
+static
+int generic_Send(void *buf, int count, MPI_Datatype datatype,=20
+ int dest, int tag, MPI_Comm comm)
{
OrigFn fn;
int err;
VALGRIND_GET_ORIG_FN(fn);
- before("Send");
+ before("{,B,S,R}Send");
check_readable(buf, count, datatype);
CALL_FN_W_6W(err, fn, buf,count,datatype,dest,tag,comm);
- after("Send", err);
+ after("{,B,S,R}Send", err);
return err;
}
+int WRAPPER_FOR(PMPI_Send)(void *buf, int count, MPI_Datatype datatype,=20
+ int dest, int tag, MPI_Comm comm) {
+ return generic_Send(buf,count,datatype, dest,tag,comm);
+}
+int WRAPPER_FOR(PMPI_Bsend)(void *buf, int count, MPI_Datatype datatype,=
=20
+ int dest, int tag, MPI_Comm comm) {
+ return generic_Send(buf,count,datatype, dest,tag,comm);
+}
+int WRAPPER_FOR(PMPI_Ssend)(void *buf, int count, MPI_Datatype datatype,=
=20
+ int dest, int tag, MPI_Comm comm) {
+ return generic_Send(buf,count,datatype, dest,tag,comm);
+}
+int WRAPPER_FOR(PMPI_Rsend)(void *buf, int count, MPI_Datatype datatype,=
=20
+ int dest, int tag, MPI_Comm comm) {
+ return generic_Send(buf,count,datatype, dest,tag,comm);
+}
=20
/* --- Recv --- */
/* pre: must be writable: (buf,count,datatype)
@@ -843,13 +844,52 @@
return err;
}
=20
+/* --- Get_count --- */
+/* pre: must be readable: *status
+ post: make defined: *count -- don't bother, libmpi will surely do thi=
s
+*/
+int WRAPPER_FOR(PMPI_Get_count)(MPI_Status* status,=20
+ MPI_Datatype ty, int* count )
+{
+ OrigFn fn;
+ int err;
+ VALGRIND_GET_ORIG_FN(fn);
+ before("Get_count");
+ check_readable_untyped(status, sizeof(*status));
+ CALL_FN_W_WWW(err, fn, status,ty,count);
+ after("Get_count", err);
+ return err;
+}
=20
+
/*------------------------------------------------------------*/
/*--- ---*/
/*--- Sec 3.7, Nonblocking communication ---*/
/*--- ---*/
/*------------------------------------------------------------*/
=20
+/* Maintain a table that makes it possible for the wrappers to
+ complete MPI_Irecv successfully.
+
+ The issue is that MPI_Irecv states the recv buffer and returns
+ immediately, giving a handle (MPI_Request) for the transaction.
+ Later the user will have to poll for completion with MPI_Wait etc,
+ and at that point these wrappers have to paint the recv buffer.
+ But the recv buffer details are not presented to MPI_Wait - only
+ the handle is. We therefore have to use a shadow table
+ (sReqs{,_size,_used,_lock}) which associates uncompleted
+ MPI_Requests with the corresponding buffer address/count/type.
+
+ Only read requests are placed in the table, since there is no need
+ to do any buffer painting following completion of an Isend - all
+ the checks for that are done at the time Isend is called.
+
+ Care has to be take to remove completed requests from the table.
+
+ Access to the table is guarded by sReqs_lock so as to make it
+ thread-safe.
+*/
+
typedef
struct {
Bool inUse;
@@ -993,9 +1033,29 @@
buf, count, (long)datatype, ix);
}
=20
+static=20
+MPI_Request* clone_Request_array ( int count, MPI_Request* orig )
+{
+ MPI_Request* copy;
+ int i;
+ LOCK_SREQS;
+ if (count < 0)=20
+ count =3D 0; /* Hmm. Call Mulder and Scully. */
+ copy =3D malloc( count * sizeof(MPI_Request) );
+ if (copy =3D=3D NULL) {
+ UNLOCK_SREQS;
+ barf("clone_Request_array: malloc failed");
+ }
+ for (i =3D 0; i < count; i++)
+ copy[i] =3D orig[i];
+ UNLOCK_SREQS;
+ return copy;
+}
+
#undef LOCK_SREQS
#undef UNLOCK_SREQS
=20
+
static void maybe_complete ( Bool error_in_status,
MPI_Request request_before,
MPI_Request request_after,
@@ -1031,41 +1091,47 @@
}
=20
=20
-static=20
-MPI_Request* clone_Request_array ( int count, MPI_Request* orig )
-{
- MPI_Request* copy;
- int i;
- if (count < 0)=20
- count =3D 0; /* Hmm. Call Mulder and Scully. */
- copy =3D malloc( count * sizeof(MPI_Request) );
- if (copy =3D=3D NULL)
- barf("clone_Request_array: malloc failed");
- for (i =3D 0; i < count; i++)
- copy[i] =3D orig[i];
- return copy;
-}
-
-
/* --- Isend --- */
/* rd: (buf,count,datatype) */
/* wr: *request */
-int WRAPPER_FOR(PMPI_Isend)(void *buf, int count, MPI_Datatype datatype,=
=20
- int dest, int tag, MPI_Comm comm,=20
- MPI_Request* request)
+static
+int generic_Isend(void *buf, int count, MPI_Datatype datatype,=20
+ int dest, int tag, MPI_Comm comm,=20
+ MPI_Request* request)
{
OrigFn fn;
int err;
VALGRIND_GET_ORIG_FN(fn);
- before("Isend");
+ before("{,B,S,R}Isend");
check_readable(buf, count, datatype);
check_writable_untyped(request, sizeof(*request));
CALL_FN_W_7W(err, fn, buf,count,datatype,dest,tag,comm,request);
make_defined_if_success_untyped(err, request, sizeof(*request));
- after("Isend", err);
+ after("{,B,S,R}Isend", err);
return err;
}
+int WRAPPER_FOR(PMPI_Isend)(void *buf, int count, MPI_Datatype datatype,=
=20
+ int dest, int tag, MPI_Comm comm,=20
+ MPI_Request* request) {
+ return generic_Isend(buf,count,datatype, dest,tag,comm, request);
+}
+int WRAPPER_FOR(PMPI_Ibsend)(void *buf, int count, MPI_Datatype datatype=
,=20
+ int dest, int tag, MPI_Comm comm,=20
+ MPI_Request* request) {
+ return generic_Isend(buf,count,datatype, dest,tag,comm, request);
+}
+int WRAPPER_FOR(PMPI_Issend)(void *buf, int count, MPI_Datatype datatype=
,=20
+ int dest, int tag, MPI_Comm comm,=20
+ MPI_Request* request) {
+ return generic_Isend(buf,count,datatype, dest,tag,comm, request);
+}
+int WRAPPER_FOR(PMPI_Irsend)(void *buf, int count, MPI_Datatype datatype=
,=20
+ int dest, int tag, MPI_Comm comm,=20
+ MPI_Request* request) {
+ return generic_Isend(buf,count,datatype, dest,tag,comm, request);
+}
=20
+
/* --- Irecv --- */
/* pre: must be writable: (buf,count,datatype), *request
post: make readable *request
@@ -1221,8 +1287,44 @@
=20
/* --- Address --- */
/* Does this have anything worth checking? */
+HAS_NO_WRAPPER(Address)
=20
+/* --- MPI 2 stuff --- */
+/* Type_extent, Type_get_contents and Type_get_envelope sometimes get
+ used intensively by the type walker (walk_type). There's no reason
+ why they couldn't be properly wrapped if needed, but doing so slows
+ everything down, so don't bother until needed. */
+HAS_NO_WRAPPER(Type_extent)
+HAS_NO_WRAPPER(Type_get_contents)
+HAS_NO_WRAPPER(Type_get_envelope)
=20
+/* --- Type_commit --- */
+int WRAPPER_FOR(PMPI_Type_commit)( MPI_Datatype* ty )
+{
+ OrigFn fn;
+ int err;
+ VALGRIND_GET_ORIG_FN(fn);
+ before("Type_commit");
+ check_readable_untyped(ty, sizeof(*ty));
+ CALL_FN_W_W(err, fn, ty);
+ after("Type_commit", err);
+ return err;
+}
+
+/* --- Type_free --- */
+int WRAPPER_FOR(PMPI_Type_free)( MPI_Datatype* ty )
+{
+ OrigFn fn;
+ int err;
+ VALGRIND_GET_ORIG_FN(fn);
+ before("Type_free");
+ check_readable_untyped(ty, sizeof(*ty));
+ CALL_FN_W_W(err, fn, ty);
+ after("Type_free", err);
+ return err;
+}
+
+
/*------------------------------------------------------------*/
/*--- ---*/
/*--- Sec 4.4, Broadcast ---*/
@@ -1384,6 +1486,46 @@
/* Hardly seems worth wrapping Comm_rank and Comm_size, but
since it's done now .. */
=20
+/* --- Comm_create --- */
+/* Let normal memcheck tracking handle this. */
+int WRAPPER_FOR(PMPI_Comm_create)(MPI_Comm comm, MPI_Group group,
+ MPI_Comm* newcomm)
+{
+ OrigFn fn;
+ int err;
+ VALGRIND_GET_ORIG_FN(fn);
+ before("Comm_create");
+ CALL_FN_W_WWW(err, fn, comm,group,newcomm);
+ after("Comm_create", err);
+ return err;
+}
+
+/* --- Comm_dup --- */
+/* Let normal memcheck tracking handle this. */
+int WRAPPER_FOR(PMPI_Comm_dup)(MPI_Comm comm, MPI_Comm* newcomm)
+{
+ OrigFn fn;
+ int err;
+ VALGRIND_GET_ORIG_FN(fn);
+ before("Comm_dup");
+ CALL_FN_W_WW(err, fn, comm,newcomm);
+ after("Comm_dup", err);
+ return err;
+}
+
+/* --- Comm_free --- */
+/* Let normal memcheck tracking handle this. */
+int WRAPPER_FOR(PMPI_Comm_free)(MPI_Comm* comm)
+{
+ OrigFn fn;
+ int err;
+ VALGRIND_GET_ORIG_FN(fn);
+ before("Comm_free");
+ CALL_FN_W_W(err, fn, comm);
+ after("Comm_free", err);
+ return err;
+}
+
/* --- Comm_rank --- */
/* wr: (rank, sizeof(*rank)) */
int WRAPPER_FOR(PMPI_Comm_rank)(MPI_Comm comm, int *rank)
@@ -1429,7 +1571,8 @@
/*------------------------------------------------------------*/
=20
/* --- Error_string --- */
-int WRAPPER_FOR(PMPI_Error_string)( int errorcode, char* string, int* re=
sultlen )
+int WRAPPER_FOR(PMPI_Error_string)( int errorcode, char* string,=20
+ int* resultlen )
{
OrigFn fn;
int err;
@@ -1499,6 +1642,7 @@
/*--- ---*/
/*------------------------------------------------------------*/
=20
+/* Boilerplate for default wrappers. */
#define DEFAULT_WRAPPER_PREAMBLE(basename) \
OrigFn fn; \
UWord res; \
@@ -1643,7 +1787,7 @@
DEFAULT_WRAPPER_W_1W(Add_error_class)
DEFAULT_WRAPPER_W_2W(Add_error_code)
DEFAULT_WRAPPER_W_2W(Add_error_string)
-DEFAULT_WRAPPER_W_2W(Address)
+/* DEFAULT_WRAPPER_W_2W(Address) */
DEFAULT_WRAPPER_W_7W(Allgather)
DEFAULT_WRAPPER_W_8W(Allgatherv)
DEFAULT_WRAPPER_W_3W(Alloc_mem)
@@ -1656,7 +1800,7 @@
DEFAULT_WRAPPER_W_3W(Attr_put)
DEFAULT_WRAPPER_W_1W(Barrier)
/* DEFAULT_WRAPPER_W_5W(Bcast) */
-DEFAULT_WRAPPER_W_6W(Bsend)
+/* DEFAULT_WRAPPER_W_6W(Bsend) */
DEFAULT_WRAPPER_W_7W(Bsend_init)
DEFAULT_WRAPPER_W_2W(Buffer_attach)
DEFAULT_WRAPPER_W_2W(Buffer_detach)
@@ -1677,13 +1821,13 @@
DEFAULT_WRAPPER_W_5W(Comm_connect)
DEFAULT_WRAPPER_W_2W(Comm_create_errhandler)
DEFAULT_WRAPPER_W_4W(Comm_create_keyval)
-DEFAULT_WRAPPER_W_3W(Comm_create)
+/* DEFAULT_WRAPPER_W_3W(Comm_create) */
DEFAULT_WRAPPER_W_2W(Comm_delete_attr)
DEFAULT_WRAPPER_W_1W(Comm_disconnect)
-DEFAULT_WRAPPER_W_2W(Comm_dup)
+/* DEFAULT_WRAPPER_W_2W(Comm_dup) */
DEFAULT_WRAPPER_W_1W(Comm_f2c)
DEFAULT_WRAPPER_W_1W(Comm_free_keyval)
-DEFAULT_WRAPPER_W_1W(Comm_free)
+/* DEFAULT_WRAPPER_W_1W(Comm_free) */
DEFAULT_WRAPPER_W_4W(Comm_get_attr)
DEFAULT_WRAPPER_W_2W(Comm_get_errhandler)
DEFAULT_WRAPPER_W_3W(Comm_get_name)
@@ -1774,7 +1918,7 @@
/* DEFAULT_WRAPPER_W_8W(Gather) */
DEFAULT_WRAPPER_W_9W(Gatherv)
DEFAULT_WRAPPER_W_2W(Get_address)
-DEFAULT_WRAPPER_W_3W(Get_count)
+/* DEFAULT_WRAPPER_W_3W(Get_count) */
DEFAULT_WRAPPER_W_3W(Get_elements)
DEFAULT_WRAPPER_W_8W(Get)
DEFAULT_WRAPPER_W_2W(Get_processor_name)
@@ -1801,7 +1945,7 @@
DEFAULT_WRAPPER_W_2W(Group_size)
DEFAULT_WRAPPER_W_5W(Group_translate_ranks)
DEFAULT_WRAPPER_W_3W(Group_union)
-DEFAULT_WRAPPER_W_7W(Ibsend)
+/* DEFAULT_WRAPPER_W_7W(Ibsend) */
DEFAULT_WRAPPER_W_1W(Info_c2f)
DEFAULT_WRAPPER_W_1W(Info_create)
DEFAULT_WRAPPER_W_2W(Info_delete)
@@ -1820,9 +1964,9 @@
DEFAULT_WRAPPER_W_3W(Intercomm_merge)
/* DEFAULT_WRAPPER_W_5W(Iprobe) */
/* DEFAULT_WRAPPER_W_7W(Irecv) */
-DEFAULT_WRAPPER_W_7W(Irsend)
+/* DEFAULT_WRAPPER_W_7W(Irsend) */
/* DEFAULT_WRAPPER_W_7W(Isend) */
-DEFAULT_WRAPPER_W_7W(Issend)
+/* DEFAULT_WRAPPER_W_7W(Issend) */
DEFAULT_WRAPPER_W_1W(Is_thread_main)
DEFAULT_WRAPPER_W_4W(Keyval_create)
DEFAULT_WRAPPER_W_1W(Keyval_free)
@@ -1850,7 +1994,7 @@
DEFAULT_WRAPPER_W_1W(Request_f2c)
DEFAULT_WRAPPER_W_1W(Request_free)
DEFAULT_WRAPPER_W_3W(Request_get_status)
-DEFAULT_WRAPPER_W_6W(Rsend)
+/* DEFAULT_WRAPPER_W_6W(Rsend) */
DEFAULT_WRAPPER_W_7W(Rsend_init)
DEFAULT_WRAPPER_W_6W(Scan)
DEFAULT_WRAPPER_W_8W(Scatter)
@@ -1860,7 +2004,7 @@
/* DEFAULT_WRAPPER_W_12W(Sendrecv) */
DEFAULT_WRAPPER_W_9W(Sendrecv_replace)
DEFAULT_WRAPPER_W_7W(Ssend_init)
-DEFAULT_WRAPPER_W_6W(Ssend)
+/* DEFAULT_WRAPPER_W_6W(Ssend) */
DEFAULT_WRAPPER_W_1W(Start)
DEFAULT_WRAPPER_W_2W(Startall)
DEFAULT_WRAPPER_W_2W(Status_c2f)
@@ -1874,7 +2018,7 @@
DEFAULT_WRAPPER_W_5W(Testsome)
DEFAULT_WRAPPER_W_2W(Topo_test)
DEFAULT_WRAPPER_W_1W(Type_c2f)
-DEFAULT_WRAPPER_W_1W(Type_commit)
+/* DEFAULT_WRAPPER_W_1W(Type_commit) */
DEFAULT_WRAPPER_W_3W(Type_contiguous)
DEFAULT_WRAPPER_W_10W(Type_create_darray)
DEFAULT_WRAPPER_W_3W(Type_create_f90_complex)
@@ -1889,13 +2033,13 @@
DEFAULT_WRAPPER_W_4W(Type_create_resized)
DEFAULT_WRAPPER_W_2W(Type_delete_attr)
DEFAULT_WRAPPER_W_2W(Type_dup)
-DEFAULT_WRAPPER_W_2W(Type_extent)
-DEFAULT_WRAPPER_W_1W(Type_free)
+/* DEFAULT_WRAPPER_W_2W(Type_extent) */
+/* DEFAULT_WRAPPER_W_1W(Type_free) */
DEFAULT_WRAPPER_W_1W(Type_free_keyval)
DEFAULT_WRAPPER_W_1W(Type_f2c)
DEFAULT_WRAPPER_W_4W(Type_get_attr)
-DEFAULT_WRAPPER_W_7W(Type_get_contents)
-DEFAULT_WRAPPER_W_5W(Type_get_envelope)
+/* DEFAULT_WRAPPER_W_7W(Type_get_contents) */
+/* DEFAULT_WRAPPER_W_5W(Type_get_envelope) */
DEFAULT_WRAPPER_W_3W(Type_get_extent)
DEFAULT_WRAPPER_W_3W(Type_get_name)
DEFAULT_WRAPPER_W_3W(Type_get_true_extent)
|
|
From: Greg P. <gp...@us...> - 2006-03-10 18:28:19
|
Nicholas Nethercote writes: > On Thu, 9 Mar 2006, Greg Parker wrote: > > I'm working to bring it up on my new MacBook Pro as we speak. > > Is that an Intel machine? Yes, 2 GHz Intel Core Duo. Thus my question about VEX's x86 carry flag :-) -- Greg Parker gp...@us... |
|
From: Michael S. <ms...@xi...> - 2006-03-10 15:53:04
|
On 3/3/06, Julian Seward <js...@ac...> wrote: > > > msmith@freeze:~$ valgrind -d -d --tool=3Dnone date > > Looks fine to me. If you discover why you've got a 2+2 setup > I'd be interested to know. I didn't quite manage to get a clear answer to this apart from some vague mumbling about suspend on laptops, but ubuntu dapper has now apparently returned to a 3/1 split as of the most recent kernel update. I'll check that it works correctly when I next reboot. Thanks for your help. Mike |
|
From: Ashley P. <as...@qu...> - 2006-03-10 14:52:56
|
On Fri, 2006-03-10 at 14:19 +0000, Julian Seward wrote:
> > You spotted that too then ;)
>
> If folks want to compile client requests into their code and
> then ship it, I guess we'd better make efforts to remain backward
> compatible :)
>
> If you see any more places where there should be a similar warning
> please let me know.
The one things that springs to mind is to put a SVN hook in which puts a
warning in the commit email you get when you change and of the installed
header files, similar to the way it warns you that printf commits are
potentially dangerous.
> At the moment we have 3 kinds of memory-painting macros:
> make_{noaccess,writable,readable}. I've been using them when
> playing with mpi wrappers, and I noticed there's something
> they can't express. Consider this schematic for data arriving
> from off-node:
>
> buf = malloc(11); // should be 12, but we made a mistake
>
> // check that the space is big enough
> check_writable(buf, 12); // gets a complaint
Yes of course, i use check_writeable here as well.
> // prod mpi to actually get the data into buf (do MPI_Recv)
> // 12 bytes arrives
>
> // mark it as defined
> make_readable(buf, 12)
>
> // ...buf[11] ... // !!! we don't get an addressing error
No which is why I wanted to make the make_readable conditional on the
writeable check succeeding. In the end I didn't because it would mean
maintaining state between the two calls and be quite intrusive. It's
not actually quite as bad as you might think though as the users will
have already seen the previous error.
> The problem is that make_readable doesn't just change the definedness
> markings (V bits), it also messes with addressibility (the A bits).
>
> What seems to be needed is a variant of make_readable which has the
> meaning "if this byte was addressible, mark it initialised, but if
> not just leave it alone". (dually make_writable).
> This would be
> useful I imagine in other situations where we're trying to describe
> how the state of memory is changing. (custom allocators?)
I've still got that bug I was hunting before xmas with the custom
allocator not reporting overruns properly by the way, I noticed you
re-enabled [g|s]et_vbits this week so I'll try to take another look
soon. Can I make a request for a GET_ABITS function as well please if
it's not to difficult.
I was thinking about sending the VBITS over the network with the data
earlier, this would involve a check_writable() function which only
returned true/false and didn't warn the user.
In fact come to think of it what does SET_VBITS do if you call in on
un-addressable memory?
Ashley,
|
|
From: <sv...@va...> - 2006-03-10 14:51:23
|
Author: sewardj
Date: 2006-03-10 14:51:19 +0000 (Fri, 10 Mar 2006)
New Revision: 5738
Log:
* try to handle MPI_{LONG,DOUBLE,SHORT}_INT better (despite the best
efforts of the MPI spec to screw this up)
* Add locking to accesses to the "sReqs" shadow-requests table
used to keep track of uncompleted MPI_Irecv's. This might
even mean the wrappers are thread-safe now :-)
Modified:
trunk/auxprogs/mpiwrap.c
Modified: trunk/auxprogs/mpiwrap.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/auxprogs/mpiwrap.c 2006-03-10 13:43:49 UTC (rev 5737)
+++ trunk/auxprogs/mpiwrap.c 2006-03-10 14:51:19 UTC (rev 5738)
@@ -451,14 +451,27 @@
/* Hmm. Perhaps it's a named struct? Unfortunately we can't
take them to bits so we have to do a really ugly hack, which
makes assumptions about how the MPI implementation has laid
- out these types.
+ out these types. At least Open MPI 1.0.1 appears to put
+ the 'val' field first.
*/
if (ty =3D=3D MPI_LONG_INT) {
- typedef struct { long dbl; int loc; } Ty;
- f(base + offsetof(Ty,dbl), sizeof(long));
+ typedef struct { long val; int loc; } Ty;
+ f(base + offsetof(Ty,val), sizeof(long));
f(base + offsetof(Ty,loc), sizeof(int));
return;
}
+ if (ty =3D=3D MPI_DOUBLE_INT) {
+ typedef struct { double val; int loc; } Ty;
+ f(base + offsetof(Ty,val), sizeof(double));
+ f(base + offsetof(Ty,loc), sizeof(int));
+ return;
+ }
+ if (ty =3D=3D MPI_SHORT_INT) {
+ typedef struct { short val; int loc; } Ty;
+ f(base + offsetof(Ty,val), sizeof(short));
+ f(base + offsetof(Ty,loc), sizeof(int));
+ return;
+ }
goto unhandled;
/*NOTREACHED*/
}
@@ -643,7 +656,9 @@
}
=20
=20
-void walk_type_EXTERNALLY_VISIBLE
+/* Hook so it's visible from outside (can be handy to dlopen/dlsym
+ it) */
+void mpiwrap_walk_type_EXTERNALLY_VISIBLE
( void(*f)(void*,long), char* base, MPI_Datatype ty )
{
return walk_type(f, base, ty);
@@ -848,9 +863,19 @@
static ShadowRequest* sReqs =3D NULL;
static int sReqs_size =3D 0;
static int sReqs_used =3D 0;
-//static pthread_mutex_t sReqs_lock =3D PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t sReqs_lock =3D PTHREAD_MUTEX_INITIALIZER;
=20
+#define LOCK_SREQS \
+ do { int pr =3D pthread_mutex_lock(&sReqs_lock); \
+ assert(pr =3D=3D 0); \
+ } while (0)
=20
+#define UNLOCK_SREQS \
+ do { int pr =3D pthread_mutex_unlock(&sReqs_lock); \
+ assert(pr =3D=3D 0); \
+ } while (0)
+
+
/* Ensure the sReqs expandable array has at least one free slot, by
copying it into a larger one if necessary. NOTE: sReqs_lock is
held throughout this procedure.*/
@@ -862,7 +887,7 @@
sReqs_size =3D sReqs_size=3D=3D0 ? 2 : 2*sReqs_size;
sReqs2 =3D malloc( sReqs_size * sizeof(ShadowRequest) );
if (sReqs2 =3D=3D NULL) {
- /* UNLOCK */
+ UNLOCK_SREQS;
barf("add_shadow_Request: malloc failed.\n");
}
for (i =3D 0; i < sReqs_used; i++)
@@ -882,14 +907,14 @@
{
ShadowRequest* ret =3D NULL;
int i;
- /* LOCK */
+ LOCK_SREQS;
for (i =3D 0; i < sReqs_used; i++) {
if (sReqs[i].inUse && eq_MPI_Request(sReqs[i].key,request)) {
ret =3D &sReqs[i];
break;
}
}
- /* UNLOCK */
+ UNLOCK_SREQS;
return ret;
}
=20
@@ -899,14 +924,14 @@
static void delete_shadow_Request ( MPI_Request request )
{
int i;
- /* LOCK */
+ LOCK_SREQS;
for (i =3D 0; i < sReqs_used; i++) {
if (sReqs[i].inUse && eq_MPI_Request(sReqs[i].key,request)) {
sReqs[i].inUse =3D False;
break;
}
}
- /* UNLOCK */
+ UNLOCK_SREQS;
}
=20
=20
@@ -918,7 +943,7 @@
MPI_Datatype datatype )
{
int i, ix =3D -1;
- /* LOCK */
+ LOCK_SREQS;
assert(sReqs_used >=3D 0);
assert(sReqs_size >=3D 0);
assert(sReqs_used <=3D sReqs_size);
@@ -961,13 +986,15 @@
sReqs[ix].count =3D count;
sReqs[ix].datatype =3D datatype;
=20
- /* UNLOCK */
+ UNLOCK_SREQS;
if (opt_verbosity > 1)
fprintf(stderr, "%s %5d: sReq+ 0x%lx -> b/c/d %p/%d/0x%lx [slot %d=
]\n",
preamble, my_pid, (unsigned long)request,=20
buf, count, (long)datatype, ix);
}
=20
+#undef LOCK_SREQS
+#undef UNLOCK_SREQS
=20
static void maybe_complete ( Bool error_in_status,
MPI_Request request_before,
|
|
From: Julian S. <js...@ac...> - 2006-03-10 14:19:53
|
> Should I be changing my client requests to call this new macro?
I believe so, but I wouldn't go hacking furiously until all this
has settled down a bit. The motivation is shown below. No, the
macro doesn't give any warnings; it doesn't need to - see below.
> > +/* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !!
> > + This enum comprises an ABI exported by Valgrind to programs
> > + which use client requests. DO NOT CHANGE THE ORDER OF THESE
> > + ENTRIES, NOT DELETE ANY -- add new ones at the end. */
>
> You spotted that too then ;)
If folks want to compile client requests into their code and
then ship it, I guess we'd better make efforts to remain backward
compatible :)
If you see any more places where there should be a similar warning
please let me know.
J
---------
At the moment we have 3 kinds of memory-painting macros:
make_{noaccess,writable,readable}. I've been using them when
playing with mpi wrappers, and I noticed there's something
they can't express. Consider this schematic for data arriving
from off-node:
buf = malloc(11); // should be 12, but we made a mistake
// check that the space is big enough
check_writable(buf, 12); // gets a complaint
// prod mpi to actually get the data into buf (do MPI_Recv)
// 12 bytes arrives
// mark it as defined
make_readable(buf, 12)
// ...buf[11] ... // !!! we don't get an addressing error
The problem is that make_readable doesn't just change the definedness
markings (V bits), it also messes with addressibility (the A bits).
What seems to be needed is a variant of make_readable which has the
meaning "if this byte was addressible, mark it initialised, but if
not just leave it alone". (dually make_writable). This would be
useful I imagine in other situations where we're trying to describe
how the state of memory is changing. (custom allocators?)
Interesting we never noticed the need for such a thing before.
|
|
From: Ashley P. <as...@qu...> - 2006-03-10 14:06:50
|
On Fri, 2006-03-10 at 13:42 +0000, sv...@va... wrote:
> Author: sewardj
> Date: 2006-03-10 13:41:58 +0000 (Fri, 10 Mar 2006)
> New Revision: 5736
>
> Log:
> Add a new kind of memory-painting primitive, which is: 'make_defined'.
> For each byte in the range, if the byte is addressible, make it be
> initialised, but if it isn't addressible, leave it alone. So it's
> like a version of make_readable which doesn't alter addressibility.
Should I be changing my client requests to call this new macro? I
assume it throws a warning to the user if you try and make something
readable which isn't addressable?
When I was looking at this before I was thinking of doing something like
the following but settled with MAKE_READABLE in the end.
#define VALGRIND_MAKE_DEFINED(base,len) do { \
if ( ! VALGRIND_CHECK_WRITEABLE(base,len) ) \
VALGRIND_MAKE_READABLE(base,len); \
} while (0)
> +/* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !!
> + This enum comprises an ABI exported by Valgrind to programs
> + which use client requests. DO NOT CHANGE THE ORDER OF THESE
> + ENTRIES, NOT DELETE ANY -- add new ones at the end. */
You spotted that too then ;)
Ashley,
|
|
From: <sv...@va...> - 2006-03-10 13:43:53
|
Author: sewardj
Date: 2006-03-10 13:43:49 +0000 (Fri, 10 Mar 2006)
New Revision: 5737
Log:
- Improve handling of MPI base types
- Use MAKE_DEFINED rather than MAKE_READABLE, as the latter's
behaviour - changing A bits as well as V bits - can hide=20
addressing problems later
Modified:
trunk/auxprogs/mpiwrap.c
Modified: trunk/auxprogs/mpiwrap.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/auxprogs/mpiwrap.c 2006-03-10 13:41:58 UTC (rev 5736)
+++ trunk/auxprogs/mpiwrap.c 2006-03-10 13:43:49 UTC (rev 5737)
@@ -109,7 +109,11 @@
typedef signed long Word;
typedef unsigned long UWord;
=20
+#if !defined(offsetof)
+# define offsetof(type,memb) ((int)&((type*)0)->memb)
+#endif
=20
+
/*------------------------------------------------------------*/
/*--- Simple helpers ---*/
/*------------------------------------------------------------*/
@@ -341,7 +345,7 @@
return (long)n;
}
=20
-/* Free up *ty, if it is not a named type */
+/* Free up *ty, if it is safe to do so */
static void maybeFreeTy ( MPI_Datatype* ty )
{
int r, n_ints, n_addrs, n_dtys, tycon;
@@ -349,23 +353,28 @@
r =3D PMPI_Type_get_envelope( *ty, &n_ints, &n_addrs, &n_dtys, &tycon=
);
assert(r =3D=3D MPI_SUCCESS);
=20
- if (tycon !=3D MPI_COMBINER_NAMED
- /* Don't ask me how ty can be a primitive type and yet not be
- marked as MPI_COMBINER_NAMED. It does appear to happen
- though. */
- && *ty !=3D MPI_LONG_INT
- ) {
- if (0) {
- /* show me what you're about to free .. */
- fprintf(stderr, "freeing combiner ");
- showCombiner(stderr,tycon);
- fprintf(stderr, " ty=3D ");
- showTy(stderr,*ty);
- fprintf(stderr,"\n");
- }
- r =3D PMPI_Type_free(ty);
- assert(r =3D=3D MPI_SUCCESS);
+ /* can't free named types */
+ if (tycon =3D=3D MPI_COMBINER_NAMED)
+ return;
+
+ /* some kinds of structs are predefined so we can't free them
+ either. */
+ if (*ty =3D=3D MPI_FLOAT_INT || *ty =3D=3D MPI_DOUBLE_INT=20
+ || *ty =3D=3D MPI_LONG_INT || *ty =3D=3D MPI_2INT=20
+ || *ty =3D=3D MPI_SHORT_INT || *ty =3D=3D MPI_LONG_DOUBLE_INT)
+ return;
+
+ /* Looks OK - free it. */
+ if (0) {
+ /* show me what you're about to free .. */
+ fprintf(stderr, "freeing combiner ");
+ showCombiner(stderr,tycon);
+ fprintf(stderr, " ty=3D ");
+ showTy(stderr,*ty);
+ fprintf(stderr,"\n");
}
+ r =3D PMPI_Type_free(ty);
+ assert(r =3D=3D MPI_SUCCESS);
}
=20
/* How big is a "named" (base) type? Returns 0 if not known. Note.
@@ -376,19 +385,31 @@
latter is 12 at least on x86. Ref: MPI 1.1 doc p18 */
static long sizeofOneNamedTy ( MPI_Datatype ty )
{
- if (ty =3D=3D MPI_DOUBLE) return sizeof(double);
- if (ty =3D=3D MPI_INT) return sizeof(signed int);
- if (ty =3D=3D MPI_CHAR) return sizeof(signed char);
- if (ty =3D=3D MPI_UNSIGNED) return sizeof(unsigned int);
- if (ty =3D=3D MPI_LONG) return sizeof(signed long int);
- if (ty =3D=3D MPI_LONG_DOUBLE) return 10; /* NOT: sizeof(long double)=
; */
- /* MPI1.1 does not define MPI_LONG_INT, hence the following is a gues=
s */
- if (ty =3D=3D MPI_LONG_INT) return sizeof(signed long int);
- if (ty =3D=3D MPI_BYTE) return 1;
- if (ty =3D=3D MPI_FLOAT) return sizeof(float);
- if (ty =3D=3D MPI_SHORT) return sizeof(signed short int);
+ if (ty =3D=3D MPI_CHAR) return sizeof(signed char);
+ if (ty =3D=3D MPI_SHORT) return sizeof(signed short int);
+ if (ty =3D=3D MPI_INT) return sizeof(signed int);
+ if (ty =3D=3D MPI_LONG) return sizeof(signed long int);
if (ty =3D=3D MPI_UNSIGNED_CHAR) return sizeof(unsigned char);
if (ty =3D=3D MPI_UNSIGNED_SHORT) return sizeof(unsigned short int);
+ if (ty =3D=3D MPI_UNSIGNED) return sizeof(unsigned int);
+ if (ty =3D=3D MPI_UNSIGNED_LONG) return sizeof(unsigned long int);
+ if (ty =3D=3D MPI_FLOAT) return sizeof(float);
+ if (ty =3D=3D MPI_DOUBLE) return sizeof(double);
+ if (ty =3D=3D MPI_LONG_DOUBLE) return 10; /* NOT: sizeof(long doub=
le); */
+ if (ty =3D=3D MPI_BYTE) return 1;
+ /* MPI_PACKED */
+ /* new in MPI2: */
+ if (ty =3D=3D MPI_WCHAR) return sizeof(wchar_t);
+ if (ty =3D=3D MPI_SIGNED_CHAR) return sizeof(signed char);
+ if (ty =3D=3D MPI_UNSIGNED_LONG_LONG) return sizeof(unsigned long lon=
g int);
+ if (ty =3D=3D MPI_LONG_LONG_INT) return sizeof(signed long long =
int);
+ /* Note: the following are named structs, not named basic types,
+ and so are not handled here:
+ FLOAT_INT DOUBLE_INT LONG_INT 2INT SHORT_INT LONG_DOUBLE_INT
+ My guess is they are probably for doing max-w-index style
+ reductions, the INT carrying the index of the max/min and the
+ other type its actual value.
+ */
return 0;
}
=20
@@ -423,10 +444,22 @@
/* Handle the base cases fast(er/ish). */
if (tycon =3D=3D MPI_COMBINER_NAMED) {
long sz =3D sizeofOneNamedTy(ty);
- if (sz =3D=3D 0)=20
- goto unhandled;
- f(base,sz);
- return;
+ if (sz > 0) {
+ f(base, sz);
+ return;
+ }
+ /* Hmm. Perhaps it's a named struct? Unfortunately we can't
+ take them to bits so we have to do a really ugly hack, which
+ makes assumptions about how the MPI implementation has laid
+ out these types.
+ */
+ if (ty =3D=3D MPI_LONG_INT) {
+ typedef struct { long dbl; int loc; } Ty;
+ f(base + offsetof(Ty,dbl), sizeof(long));
+ f(base + offsetof(Ty,loc), sizeof(int));
+ return;
+ }
+ goto unhandled;
/*NOTREACHED*/
}
=20
@@ -560,11 +593,16 @@
if (ints) free(ints);
if (addrs) free(addrs);
if (dtys) free(dtys);
+ if (opt_missing >=3D 2)
+ barf("walk_type: unhandled combiner, strict checking selected");
}
=20
=20
-/* Same as walk_type but apply 'f' to every element in an array
- of 'count' items starting at 'base'. */
+/* Same as walk_type but apply 'f' to every element in an array of
+ 'count' items starting at 'base'. The only purpose of pushing this
+ into a different routine is so it can attempt to optimise the case
+ where the array elements are contiguous and packed together without
+ holes. */
static=20
void walk_type_array ( void(*f)(void*,long), char* base,=20
MPI_Datatype elemTy, long count )
@@ -639,19 +677,19 @@
}
=20
static inline
-void make_readable_untyped ( void* buffer, long nbytes )
+void make_defined_untyped ( void* buffer, long nbytes )
{
if (nbytes > 0) {
- VALGRIND_MAKE_READABLE(buffer, nbytes);
+ VALGRIND_MAKE_DEFINED(buffer, nbytes);
}
}
=20
static inline
-void make_readable_if_success_untyped ( int err,=20
- void* buffer, long nbytes )
+void make_defined_if_success_untyped ( int err,=20
+ void* buffer, long nbytes )
{
if (err =3D=3D MPI_SUCCESS && nbytes > 0) {
- VALGRIND_MAKE_READABLE(buffer, nbytes);
+ VALGRIND_MAKE_DEFINED(buffer, nbytes);
}
}
=20
@@ -694,22 +732,22 @@
}
=20
=20
-/* Set the specified area to 'addressible and defined' (safe-to-read)
- state. */
+/* Set the specified area to 'defined for each byte which is
+ addressible' state. */
=20
static
-void make_readable ( void *buffer, int count, MPI_Datatype datatype )
+void make_defined ( void *buffer, int count, MPI_Datatype datatype )
{
- walk_type_array( make_readable_untyped, buffer, datatype, count );
+ walk_type_array( make_defined_untyped, buffer, datatype, count );
}
=20
static
void=20
-make_readable_if_success ( int err, void *buffer, int count,=20
- MPI_Datatype datatype )
+make_defined_if_success ( int err, void *buffer, int count,=20
+ MPI_Datatype datatype )
{
if (err =3D=3D MPI_SUCCESS)
- make_readable(buffer, count, datatype);
+ make_defined(buffer, count, datatype);
}
=20
=20
@@ -784,7 +822,7 @@
check_writable_untyped(status, sizeof(*status));
CALL_FN_W_7W(err, fn, buf,count,datatype,source,tag,comm,status);
if (err =3D=3D MPI_SUCCESS && count_from_Status(&recv_count,datatype,=
status)) {
- make_readable(buf, recv_count, datatype);
+ make_defined(buf, recv_count, datatype);
}
after("Recv", err);
return err;
@@ -956,7 +994,7 @@
/* The Irecv detailed in 'shadow' completed. Make the result
buffer, and delete the entry. */
if (count_from_Status(&recv_count, shadow->datatype, status)) {
- make_readable(shadow->buf, recv_count, shadow->datatype);
+ make_defined(shadow->buf, recv_count, shadow->datatype);
if (opt_verbosity > 1)
fprintf(stderr, "%s %5d: sReq- %p (completed)\n",=20
preamble, my_pid, request_before);
@@ -996,7 +1034,7 @@
check_readable(buf, count, datatype);
check_writable_untyped(request, sizeof(*request));
CALL_FN_W_7W(err, fn, buf,count,datatype,dest,tag,comm,request);
- make_readable_if_success_untyped(err, request, sizeof(*request));
+ make_defined_if_success_untyped(err, request, sizeof(*request));
after("Isend", err);
return err;
}
@@ -1019,7 +1057,7 @@
check_writable_untyped(request, sizeof(*request));
CALL_FN_W_7W(err, fn, buf,count,datatype,source,tag,comm,request);
if (err =3D=3D MPI_SUCCESS) {
- make_readable_untyped(request, sizeof(*request));
+ make_defined_untyped(request, sizeof(*request));
add_shadow_Request( *request, buf,count,datatype );
}
after("Irecv", err);
@@ -1043,7 +1081,7 @@
if (err =3D=3D MPI_SUCCESS) {
maybe_complete(False/*err in status?*/,=20
request_before, *request, status);
- make_readable_untyped(status, sizeof(MPI_Status));
+ make_defined_untyped(status, sizeof(MPI_Status));
}
after("Wait", err);
return err;
@@ -1073,7 +1111,7 @@
for (i =3D 0; i < count; i++) {
maybe_complete(e_i_s, requests_before[i], requests[i],=20
&statuses[i]);
- make_readable_untyped(&statuses[i], sizeof(MPI_Status));
+ make_defined_untyped(&statuses[i], sizeof(MPI_Status));
}
}
if (requests_before)
@@ -1100,9 +1138,9 @@
check_writable_untyped(status, sizeof(*status));
CALL_FN_W_5W(err, fn, source,tag,comm,flag,status);
if (err =3D=3D MPI_SUCCESS) {
- make_readable_untyped(flag, sizeof(*flag));
+ make_defined_untyped(flag, sizeof(*flag));
if (*flag)
- make_readable_untyped(status, sizeof(*status));
+ make_defined_untyped(status, sizeof(*status));
else
make_writable_untyped(status, sizeof(*status));
}
@@ -1141,7 +1179,7 @@
comm,status);
if (err =3D=3D MPI_SUCCESS=20
&& count_from_Status(&recvcount_actual,recvtype,status)) {
- make_readable(recvbuf, recvcount_actual, recvtype);
+ make_defined(recvbuf, recvcount_actual, recvtype);
}
after("Sendrecv", err);
return err;
@@ -1189,7 +1227,7 @@
check_writable(buffer, count, datatype);
}
CALL_FN_W_5W(err, fn, buffer,count,datatype,root,comm);
- make_readable_if_success(err, buffer, count, datatype);
+ make_defined_if_success(err, buffer, count, datatype);
after("Bcast", err);
return err;=20
}
@@ -1230,7 +1268,7 @@
CALL_FN_W_8W(err, fn, sendbuf,sendcount,sendtype,
recvbuf,recvcount,recvtype,
root,comm);
- make_readable_if_success(err, recvbuf, recvcount * sz, recvtype);
+ make_defined_if_success(err, recvbuf, recvcount * sz, recvtype);
after("Gather", err);
return err;
}
@@ -1262,7 +1300,7 @@
check_writable(recvbuf, count, datatype);
CALL_FN_W_7W(err, fn, sendbuf,recvbuf,count,datatype,op,root,comm);
if (i_am_root)
- make_readable_if_success(err, recvbuf, count, datatype);
+ make_defined_if_success(err, recvbuf, count, datatype);
after("Reduce", err);
return err;
}
@@ -1284,7 +1322,7 @@
check_readable(sendbuf, count, datatype);
check_writable(recvbuf, count, datatype);
CALL_FN_W_6W(err, fn, sendbuf,recvbuf,count,datatype,op,comm);
- make_readable_if_success(err, recvbuf, count, datatype);
+ make_defined_if_success(err, recvbuf, count, datatype);
after("Allreduce", err);
return err;
}
@@ -1304,7 +1342,7 @@
before("Op_create");
check_writable_untyped(op, sizeof(*op));
CALL_FN_W_WWW(err, fn, function,commute,op);
- make_readable_if_success_untyped(err, op, sizeof(*op));
+ make_defined_if_success_untyped(err, op, sizeof(*op));
after("Op_create", err);
return err;
}
@@ -1329,7 +1367,7 @@
before("Comm_rank");
check_writable_untyped(rank, sizeof(*rank));
CALL_FN_W_WW(err, fn, comm,rank);
- make_readable_if_success_untyped(err, rank, sizeof(*rank));
+ make_defined_if_success_untyped(err, rank, sizeof(*rank));
after("Comm_rank", err);
return err;
}
@@ -1344,7 +1382,7 @@
before("Comm_size");
check_writable_untyped(size, sizeof(*size));
CALL_FN_W_WW(err, fn, comm,size);
- make_readable_if_success_untyped(err, size, sizeof(*size));
+ make_defined_if_success_untyped(err, size, sizeof(*size));
after("Comm_size", err);
return err;
}
@@ -1410,7 +1448,7 @@
before("Initialized");
check_writable_untyped(flag, sizeof(int));
CALL_FN_W_W(err, fn, flag);
- make_readable_if_success_untyped(err, flag, sizeof(int));
+ make_defined_if_success_untyped(err, flag, sizeof(int));
after("Initialized", err);
return err;
}
|
|
From: <sv...@va...> - 2006-03-10 13:42:17
|
Author: sewardj
Date: 2006-03-10 13:41:58 +0000 (Fri, 10 Mar 2006)
New Revision: 5736
Log:
Add a new kind of memory-painting primitive, which is: 'make_defined'.
For each byte in the range, if the byte is addressible, make it be
initialised, but if it isn't addressible, leave it alone. So it's
like a version of make_readable which doesn't alter addressibility.
Modified:
trunk/memcheck/mc_main.c
trunk/memcheck/memcheck.h
Modified: trunk/memcheck/mc_main.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/memcheck/mc_main.c 2006-03-09 19:08:20 UTC (rev 5735)
+++ trunk/memcheck/mc_main.c 2006-03-10 13:41:58 UTC (rev 5736)
@@ -741,7 +741,23 @@
set_address_range_perms ( a, len, VGM_BIT_VALID, VGM_BIT_VALID );
}
=20
+/* For each byte in [a,a+len), if the byte is addressable, make it be
+ defined, but if it isn't addressible, leave it alone. In other
+ words a version of mc_make_readable that doesn't mess with
+ addressibility. Low-performance implementation. */
+static void mc_make_defined ( Addr a, SizeT len )
+{
+ SizeT i;
+ UWord abit, vbyte;
+ DEBUG("mc_make_defined(%p, %llu)\n", a, (ULong)len);
+ for (i =3D 0; i < len; i++) {
+ get_abit_and_vbyte( &abit, &vbyte, a+i );
+ if (EXPECTED_TAKEN(abit =3D=3D VGM_BIT_VALID))
+ set_vbyte(a+i, VGM_BYTE_VALID);
+ }
+}
=20
+
/* --- Block-copy permissions (needed for implementing realloc() and
sys_mremap). --- */
=20
@@ -2519,6 +2535,11 @@
*ret =3D -1;
break;
=20
+ case VG_USERREQ__MAKE_DEFINED: /* make defined */
+ mc_make_defined ( arg[1], arg[2] );
+ *ret =3D -1;
+ break;
+
case VG_USERREQ__CREATE_BLOCK: /* describe a block */
if (arg[1] !=3D 0 && arg[2] !=3D 0) {
i =3D alloc_client_block();
Modified: trunk/memcheck/memcheck.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/memcheck/memcheck.h 2006-03-09 19:08:20 UTC (rev 5735)
+++ trunk/memcheck/memcheck.h 2006-03-10 13:41:58 UTC (rev 5736)
@@ -70,6 +70,10 @@
=20
#include "valgrind.h"
=20
+/* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !!=20
+ This enum comprises an ABI exported by Valgrind to programs
+ which use client requests. DO NOT CHANGE THE ORDER OF THESE
+ ENTRIES, NOT DELETE ANY -- add new ones at the end. */
typedef
enum {=20
VG_USERREQ__MAKE_NOACCESS =3D VG_USERREQ_TOOL_BASE('M','C'),
@@ -86,6 +90,8 @@
=20
VG_USERREQ__CREATE_BLOCK,
=20
+ VG_USERREQ__MAKE_DEFINED,
+
/* This is just for memcheck's internal use - don't use it */
_VG_USERREQ__MEMCHECK_RECORD_OVERLAP_ERROR=20
=3D VG_USERREQ_TOOL_BASE('M','C') + 256
@@ -125,6 +131,18 @@
_qzz_res; \
}))
=20
+/* Similar to mark memory at VALGRIND_MAKE_READABLE except that
+ addressibility is not altered: bytes which are addressible are
+ marked as defined, but those which are not addressible are
+ left unchanged. */
+#define VALGRIND_MAKE_DEFINED(_qzz_addr,_qzz_len) \
+ (__extension__({unsigned int _qzz_res; \
+ VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0 /* default return */, \
+ VG_USERREQ__MAKE_DEFINED, \
+ _qzz_addr, _qzz_len, 0, 0, 0); \
+ _qzz_res; \
+ }))
+
/* Create a block-description handle. The description is an ascii
string which is included in any messages pertaining to addresses
within the specified memory range. Has no other effect on the
|
|
From: <js...@ac...> - 2006-03-10 10:53:44
|
Nightly build on minnie ( SuSE 10.0, ppc32 ) started at 2006-03-10 02:00:01 GMT Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 194 tests, 11 stderr failures, 5 stdout failures ================= memcheck/tests/leak-cycle (stderr) memcheck/tests/leak-tree (stderr) memcheck/tests/leakotron (stdout) memcheck/tests/mempool (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/sigaltstack (stderr) memcheck/tests/stack_changes (stdout) memcheck/tests/stack_changes (stderr) memcheck/tests/xml1 (stderr) none/tests/faultstatus (stderr) none/tests/mremap (stderr) none/tests/ppc32/jm-fp (stdout) none/tests/ppc32/jm-fp (stderr) none/tests/ppc32/test_fx (stdout) none/tests/ppc32/test_fx (stderr) none/tests/ppc32/test_gx (stdout) |
|
From: <js...@ac...> - 2006-03-10 04:51:51
|
Nightly build on phoenix ( SuSE 10.0 ) started at 2006-03-10 03:30:01 GMT Checking out vex source tree ... done Building vex ... done Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 225 tests, 6 stderr failures, 0 stdout failures ================= memcheck/tests/leak-tree (stderr) memcheck/tests/stack_switch (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/x86/scalar_supp (stderr) none/tests/x86/faultstatus (stderr) none/tests/x86/int (stderr) |
|
From: Nicholas N. <nj...@cs...> - 2006-03-10 04:07:18
|
On Thu, 9 Mar 2006, Greg Parker wrote: > I'm working to bring it up on my new MacBook Pro as we speak. Is that an Intel machine? |
|
From: Tom H. <to...@co...> - 2006-03-10 03:43:50
|
Nightly build on dunsmere ( athlon, Fedora Core 4 ) started at 2006-03-10 03:30:06 GMT Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 227 tests, 8 stderr failures, 1 stdout failure ================= memcheck/tests/leak-tree (stderr) memcheck/tests/mempool (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/stack_switch (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/x86/scalar_supp (stderr) memcheck/tests/x86/sse1_memory (stdout) none/tests/x86/faultstatus (stderr) none/tests/x86/int (stderr) |
|
From: <js...@ac...> - 2006-03-10 03:43:35
|
Nightly build on g5 ( YDL 4.0, ppc970 ) started at 2006-03-10 04:40:00 CET Results differ from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... failed Last 20 lines of verbose log follow echo mpiwrap.c: In function `_vgwZU_libmpiZdsoZa_PMPI_Waitall': mpiwrap.c:1069: warning: implicit declaration of function `CALL_FN_W_WWW' mpiwrap.c: In function `_vgwZU_libmpiZdsoZa_PMPI_Iprobe': mpiwrap.c:1101: warning: implicit declaration of function `CALL_FN_W_5W' mpiwrap.c: In function `_vgwZU_libmpiZdsoZa_PMPI_Sendrecv': mpiwrap.c:1139: warning: implicit declaration of function `CALL_FN_W_12W' mpiwrap.c: In function `_vgwZU_libmpiZdsoZa_PMPI_Gather': mpiwrap.c:1230: warning: implicit declaration of function `CALL_FN_W_8W' mpiwrap.c: In function `_vgwZU_libmpiZdsoZa_PMPI_Accumulate': mpiwrap.c:1577: warning: implicit declaration of function `CALL_FN_W_9W' mpiwrap.c: In function `_vgwZU_libmpiZdsoZa_PMPI_Attr_get': mpiwrap.c:1590: warning: implicit declaration of function `CALL_FN_W_WWWW' mpiwrap.c: In function `_vgwZU_libmpiZdsoZa_PMPI_Type_create_darray': mpiwrap.c:1814: warning: implicit declaration of function `CALL_FN_W_10W' mpicc: No such file or directory make[2]: *** [libmpiwrap.so] Error 1 make[2]: Leaving directory `/home/sewardj/Nightly/valgrind/auxprogs' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/home/sewardj/Nightly/valgrind' make: *** [all] Error 2 ================================================= == Results from 24 hours ago == ================================================= Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... failed Last 20 lines of verbose log follow echo mpiwrap.c: In function `walk_type': mpiwrap.c:420: warning: cast to pointer from integer of different size mpiwrap.c: In function `_vgwZU_libmpiZdsoZa_PMPI_Send': mpiwrap.c:748: warning: implicit declaration of function `CALL_FN_W_6W' mpiwrap.c: In function `_vgwZU_libmpiZdsoZa_PMPI_Recv': mpiwrap.c:773: warning: implicit declaration of function `CALL_FN_W_7W' mpiwrap.c: In function `_vgwZU_libmpiZdsoZa_PMPI_Waitall': mpiwrap.c:1076: warning: implicit declaration of function `CALL_FN_W_WWW' mpiwrap.c: In function `_vgwZU_libmpiZdsoZa_PMPI_Iprobe': mpiwrap.c:1115: warning: implicit declaration of function `CALL_FN_W_5W' mpiwrap.c: In function `_vgwZU_libmpiZdsoZa_PMPI_Sendrecv': mpiwrap.c:1156: warning: implicit declaration of function `CALL_FN_W_12W' mpiwrap.c: In function `_vgwZU_libmpiZdsoZa_PMPI_Gather': mpiwrap.c:1250: warning: implicit declaration of function `CALL_FN_W_8W' mpicc: No such file or directory make[2]: *** [libmpiwrap.so] Error 1 make[2]: Leaving directory `/home/sewardj/Nightly/valgrind/auxprogs' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/home/sewardj/Nightly/valgrind' make: *** [all] Error 2 ================================================= == Difference between 24 hours ago and now == ================================================= *** old.short Fri Mar 10 04:41:53 2006 --- new.short Fri Mar 10 04:43:32 2006 *************** *** 6,21 **** Last 20 lines of verbose log follow echo - mpiwrap.c: In function `walk_type': - mpiwrap.c:420: warning: cast to pointer from integer of different size - mpiwrap.c: In function `_vgwZU_libmpiZdsoZa_PMPI_Send': - mpiwrap.c:748: warning: implicit declaration of function `CALL_FN_W_6W' - mpiwrap.c: In function `_vgwZU_libmpiZdsoZa_PMPI_Recv': - mpiwrap.c:773: warning: implicit declaration of function `CALL_FN_W_7W' mpiwrap.c: In function `_vgwZU_libmpiZdsoZa_PMPI_Waitall': ! mpiwrap.c:1076: warning: implicit declaration of function `CALL_FN_W_WWW' mpiwrap.c: In function `_vgwZU_libmpiZdsoZa_PMPI_Iprobe': ! mpiwrap.c:1115: warning: implicit declaration of function `CALL_FN_W_5W' mpiwrap.c: In function `_vgwZU_libmpiZdsoZa_PMPI_Sendrecv': ! mpiwrap.c:1156: warning: implicit declaration of function `CALL_FN_W_12W' mpiwrap.c: In function `_vgwZU_libmpiZdsoZa_PMPI_Gather': ! mpiwrap.c:1250: warning: implicit declaration of function `CALL_FN_W_8W' mpicc: No such file or directory --- 6,21 ---- Last 20 lines of verbose log follow echo mpiwrap.c: In function `_vgwZU_libmpiZdsoZa_PMPI_Waitall': ! mpiwrap.c:1069: warning: implicit declaration of function `CALL_FN_W_WWW' mpiwrap.c: In function `_vgwZU_libmpiZdsoZa_PMPI_Iprobe': ! mpiwrap.c:1101: warning: implicit declaration of function `CALL_FN_W_5W' mpiwrap.c: In function `_vgwZU_libmpiZdsoZa_PMPI_Sendrecv': ! mpiwrap.c:1139: warning: implicit declaration of function `CALL_FN_W_12W' mpiwrap.c: In function `_vgwZU_libmpiZdsoZa_PMPI_Gather': ! mpiwrap.c:1230: warning: implicit declaration of function `CALL_FN_W_8W' ! mpiwrap.c: In function `_vgwZU_libmpiZdsoZa_PMPI_Accumulate': ! mpiwrap.c:1577: warning: implicit declaration of function `CALL_FN_W_9W' ! mpiwrap.c: In function `_vgwZU_libmpiZdsoZa_PMPI_Attr_get': ! mpiwrap.c:1590: warning: implicit declaration of function `CALL_FN_W_WWWW' ! mpiwrap.c: In function `_vgwZU_libmpiZdsoZa_PMPI_Type_create_darray': ! mpiwrap.c:1814: warning: implicit declaration of function `CALL_FN_W_10W' mpicc: No such file or directory |
|
From: Greg P. <gp...@us...> - 2006-03-10 03:36:48
|
Syscalls on Mac OS X for Intel return success or failure in the carry bit. This means do_syscall_for_client() needs to store the real carry flag into the VEX state. I see VEX has a LibVEX_GuestX86_get_eflags() function to read the carry bit and other flags, but I don't see a way to write it. The actual representation of the eflags makes my head spin. -- Greg Parker gp...@us... |
|
From: Tom H. <th...@cy...> - 2006-03-10 03:30:50
|
Nightly build on alvis ( i686, Red Hat 7.3 ) started at 2006-03-10 03:15:03 GMT Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 226 tests, 21 stderr failures, 1 stdout failure ================= memcheck/tests/addressable (stderr) memcheck/tests/badjump (stderr) memcheck/tests/describe-block (stderr) memcheck/tests/erringfds (stderr) memcheck/tests/leak-0 (stderr) memcheck/tests/leak-cycle (stderr) memcheck/tests/leak-regroot (stderr) memcheck/tests/leak-tree (stderr) memcheck/tests/match-overrun (stderr) memcheck/tests/mempool (stderr) memcheck/tests/partial_load_dflt (stderr) memcheck/tests/partial_load_ok (stderr) memcheck/tests/partiallydefinedeq (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/sigkill (stderr) memcheck/tests/stack_changes (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/x86/scalar_supp (stderr) memcheck/tests/x86/sse1_memory (stdout) memcheck/tests/xml1 (stderr) none/tests/x86/faultstatus (stderr) none/tests/x86/int (stderr) |
|
From: Tom H. <th...@cy...> - 2006-03-10 03:27:29
|
Nightly build on gill ( x86_64, Fedora Core 2 ) started at 2006-03-10 03:00:02 GMT Results differ from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 249 tests, 7 stderr failures, 1 stdout failure ================= memcheck/tests/stack_switch (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/x86/scalar_supp (stderr) memcheck/tests/x86/sse1_memory (stdout) none/tests/amd64/faultstatus (stderr) none/tests/fdleak_fcntl (stderr) none/tests/x86/faultstatus (stderr) none/tests/x86/int (stderr) ================================================= == Results from 24 hours ago == ================================================= Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 249 tests, 7 stderr failures, 2 stdout failures ================= memcheck/tests/stack_switch (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/x86/scalar_supp (stderr) memcheck/tests/x86/sse1_memory (stdout) none/tests/amd64/faultstatus (stderr) none/tests/fdleak_fcntl (stderr) none/tests/tls (stdout) none/tests/x86/faultstatus (stderr) none/tests/x86/int (stderr) ================================================= == Difference between 24 hours ago and now == ================================================= *** old.short Fri Mar 10 03:18:04 2006 --- new.short Fri Mar 10 03:27:16 2006 *************** *** 8,10 **** ! == 249 tests, 7 stderr failures, 2 stdout failures ================= memcheck/tests/stack_switch (stderr) --- 8,10 ---- ! == 249 tests, 7 stderr failures, 1 stdout failure ================= memcheck/tests/stack_switch (stderr) *************** *** 15,17 **** none/tests/fdleak_fcntl (stderr) - none/tests/tls (stdout) none/tests/x86/faultstatus (stderr) --- 15,16 ---- |
|
From: Tom H. <th...@cy...> - 2006-03-10 03:25:04
|
Nightly build on dellow ( x86_64, Fedora Core 4 ) started at 2006-03-10 03:10:07 GMT Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 249 tests, 6 stderr failures, 1 stdout failure ================= memcheck/tests/pointer-trace (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/x86/scalar_supp (stderr) memcheck/tests/x86/sse1_memory (stdout) none/tests/amd64/faultstatus (stderr) none/tests/x86/faultstatus (stderr) none/tests/x86/int (stderr) |
|
From: Tom H. <th...@cy...> - 2006-03-10 03:21:26
|
Nightly build on aston ( x86_64, Fedora Core 3 ) started at 2006-03-10 03:05:13 GMT Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 249 tests, 6 stderr failures, 1 stdout failure ================= memcheck/tests/stack_switch (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/x86/scalar_supp (stderr) memcheck/tests/x86/sse1_memory (stdout) none/tests/amd64/faultstatus (stderr) none/tests/x86/faultstatus (stderr) none/tests/x86/int (stderr) |
|
From: Greg P. <gp...@us...> - 2006-03-10 02:01:23
|
Craig Dooley writes: > It appears to have been awhile since there has been any updates on > the status of valgrind on Darwin. I was wondering if there is still > an effort around this port, and if so, if there is any room for help? I'm working to bring it up on my new MacBook Pro as we speak. Otherwise I've been busy with Real Work for the past few months and haven't made much progress. I expect to have some time to hack this month, at which point it should be ready for broader development help. (You'll need a non-G5 Mac, though; vex doesn't know about 64-bit instructions in a 32-bit process, which Mac OS X uses often.) -- Greg Parker gp...@us... |
|
From: Craig D. <xln...@gm...> - 2006-03-10 01:30:21
|
It appears to have been awhile since there has been any updates on the status of valgrind on Darwin. I was wondering if there is still an effort around this port, and if so, if there is any room for help? -Craig ---------------------------------------- Craig Dooley xln...@gm... |