modified the CmiVectorSend functions, now a negative number means that the packets...
authorFilippo Gioachin <gioachin@illinois.edu>
Wed, 20 Apr 2005 18:28:22 +0000 (18:28 +0000)
committerFilippo Gioachin <gioachin@illinois.edu>
Wed, 20 Apr 2005 18:28:22 +0000 (18:28 +0000)
src/arch/template/machine.c
src/ck-core/ckarray.h
src/conv-core/convcore.c
src/conv-core/converse.h
src/conv-core/global-elfgot.C
src/util/pup_cmialloc.h

index 71509b5135776d4885778b32c5d7bf14fb09503a..215ce46ab5625afc9222ae3443a2cdbcc9aa0831 100644 (file)
@@ -68,9 +68,9 @@ void          CmiFreeMulticastFn(CmiGroup, int, char*);
 #endif
 
 #if ! CMK_VECTOR_SEND_USES_COMMON_CODE
-void          CmiSyncVectorSendSystem(int, int, int *, char **, int);
-CmiCommHandle CmiAsyncVectorSendSystem(int, int, int *, char **, int);
-void          CmiSyncVectorSendAndFreeSystem(int, int, int *, char **, int);
+void          CmiSyncVectorSend(int, int, int *, char **);
+CmiCommHandle CmiAsyncVectorSend(int, int, int *, char **);
+void          CmiSyncVectorSendAndFree(int, int, int *, char **);
 #endif
 
 
index fda9d979366e9b2b8bc59e285fb190188506a2b6..40313de177a66cf00a359c71bcb2023f75e0c68b 100644 (file)
@@ -105,8 +105,6 @@ public:
                nInts=sizeof(obj)/sizeof(int);}
 };
 
-#define ALIGN8(x)       (int)((~7)&((x)+7))
-
 /********************* CkArrayListener ****************/
 ///An arrayListener is an object that gets informed whenever
 /// an array element is created, migrated, or destroyed.
index 81df99be3915916465033753b8840a5fd412a641..3f2b650f672cbf05a381df529e393e80dcc0d727 100644 (file)
@@ -1491,62 +1491,23 @@ void CsdInit(argv)
  *
  ****************************************************************************/
 
-#define PAD8(x)    ((x+0x07)&(~0x07))
-
 #if CMK_VECTOR_SEND_USES_COMMON_CODE
 
-void CmiSyncVectorSendSystem(destPE, n, sizes, msgs, system)
-int destPE, n;
-int *sizes;
-char **msgs;
-int system;
-{
-  int i, total;
-  char *mesg, *tmp;
-  
-  if (system) {
-    for(i=0,total=0;i<n;i++) total += PAD8(sizes[i]);
-    total += (n-1)*sizeof(CmiChunkHeader);
-  } else {
-    for(i=0,total=0;i<n;i++) total += sizes[i];
-  }
-  mesg = (char *) CmiAlloc(total);
-  tmp=mesg;
-  if (system) {
-    memcpy(tmp, msgs[0], sizes[0]);
-    tmp += PAD8(sizes[i]);
-    for (i=1; i<n; ++i) {
-      memcpy(tmp, msgs[i]-sizeof(CmiChunkHeader), sizes[i]+sizeof(CmiChunkHeader));
-      tmp += PAD8(sizes[i])+sizeof(CmiChunkHeader);
-    }
-  } else {
-    for(i=0;i<n;i++) {
-      memcpy(tmp, msgs[i],sizes[i]);
-      tmp += sizes[i];
-    }
-  }
+void CmiSyncVectorSend(int destPE, int n, int *sizes, char **msgs) {
+  int total;
+  char *mesg;
+  COMPACT_VECTOR(total, mesg, n, sizes, msgs);
   CmiSyncSendAndFree(destPE, total, mesg);
 }
 
-CmiCommHandle CmiAsyncVectorSendSystem(destPE, n, sizes, msgs, system)
-int destPE, n;
-int *sizes;
-char **msgs;
-int system;
-{
-  CmiSyncVectorSendSystem(destPE,n,sizes,msgs,system);
+void CmiASyncVectorSend(int destPE, int n, int *sizes, char **msgs) {
+  CmiSyncVectorSend(destPE, n, sizes, msgs);
   return NULL;
 }
 
-void CmiSyncVectorSendAndFreeSystem(destPE, n, sizes, msgs, system)
-int destPE, n;
-int *sizes;
-char **msgs;
-int system;
-{
+void CmiSyncVectorSendAndFree(int destPE, int n, int *sizes, char **msgs) {
   int i;
-
-  CmiSyncVectorSendSystem(destPE,n,sizes,msgs,system);
+  CmiSyncVectorSendAndFree(destPE, n, sizes, msgs);
   for(i=0;i<n;i++) CmiFree(msgs[i]);
   CmiFree(sizes);
   CmiFree(msgs);
@@ -1554,18 +1515,6 @@ int system;
 
 #endif
 
-void CmiSyncVectorSend(int destPE, int n, int *sizes, char **msgs) {
-  CmiSyncVectorSendSystem(destPE, n, sizes, msgs, 0);
-}
-
-void CmiASyncVectorSend(int destPE, int n, int *sizes, char **msgs) {
-  CmiAsyncVectorSendSystem(destPE, n, sizes, msgs, 0);
-}
-
-void CmiSyncVectorSendAndFree(int destPE, int n, int *sizes, char **msgs) {
-  CmiSyncVectorSendAndFreeSystem(destPE, n, sizes, msgs, 0);
-}
-
 /*****************************************************************************
  *
  * Multicast groups
index f9004a569dabf39456e24d954d9a96da16aa2d3a..4997bbe8144d4103f4083ca071ffc4e4f2133608 100644 (file)
@@ -33,6 +33,8 @@
 #ifndef CONVERSE_H
 #define CONVERSE_H
 
+#define ALIGN8(x)        (int)((~7)&((x)+7))
+
 /**
   Grab configuration files generated by build and configure scripts. 
 */
@@ -744,6 +746,45 @@ void     CmiLookupGroup(CmiGroup grp, int *npes, int **pes);
 
 /****** CMI MESSAGE TRANSMISSION ******/
 
+/* Utility function: it packs a multiple chunk message into a singly one.
+ * Receives the two return values outsize and outdata to return the size of the
+ * composed message and the message itself. It receives the number of chunks to
+ * compact, their sizes and datas. The types of the parameters are:
+ *
+ * int outsize, inndata, insizes;
+ * char *outdata;
+ * char **indatas;
+ *
+ * If inndata is negative, it means that the messages need to be copied together
+ * with their memory header at the beginning (message nesting), and padded to 8
+ * bytes. The first message never has its memory header attached (it uses the
+ * one of the new message).
+ */
+#define VECTOR_COMPACT(outsize,outdata,inndata,insizes,indatas) {\
+  int i;\
+  char *tmp;\
+  outsize=0;\
+  if (ndata>=0) for(i=0; i<ndata; ++i) outsize += insizes[i];\
+  else {\
+    for(i=0; i<-ndata; ++i) outsize += ALIGN8(insizes[i]);\
+    outsize -= (ndata+1) * sizeof(CmiChunkHeader);\
+  }\
+  outdata = (char *)CmiAlloc(outsize);\
+  if (!outdata) fprintf(stderr, "%d: Out of mem\n", _Cmi_mynode);\
+  tmp = data;\
+  if (ndata>=0) for (i=0; i<ndata; ++i) {\
+    memcpy(tmp, indatas[i]; insizes[i]);\
+    tmp += sizes[i];\
+  } else {\
+    memcpy(tmp, indatas[0]; insizes[0]);\
+    tmp += ALIGN8(insizes[0]);\
+    for (i=0; i<-ndata; ++i) {\
+      memcpy(tmp, indatas[i]-sizeof(CmiChunkHeader), insizes[i]+sizeof(CmiChunkHeader));\
+      tmp += ALIGN8(insizes[i])+sizeof(CmiChunkHeader);\
+    }\
+  }\
+}
+
 void          CmiSyncSendFn(int, int, char *);
 CmiCommHandle CmiAsyncSendFn(int, int, char *);
 void          CmiFreeSendFn(int, int, char *);
@@ -764,15 +805,15 @@ void          CmiSyncMulticastFn(CmiGroup, int, char*);
 CmiCommHandle CmiAsyncMulticastFn(CmiGroup, int, char*);
 void          CmiFreeMulticastFn(CmiGroup, int, char*);
 
-/* This first version has the default system parameter to 0 */
+/* If the second parameter (the number of chunks to send) is negative, then
+ * every message will be started aligned with 8 bytes, and a message header will
+ * be preponed to every message (message nesting), except the first one which
+ * uses that of the entire message.
+ */
 void          CmiSyncVectorSend(int, int, int *, char **);
 CmiCommHandle CmiAsyncVectorSend(int, int, int *, char **);
 void          CmiSyncVectorSendAndFree(int, int, int *, char **);
 
-void          CmiSyncVectorSendSystem(int, int, int *, char **, int);
-CmiCommHandle CmiAsyncVectorSendSystem(int, int, int *, char **, int);
-void          CmiSyncVectorSendAndFreeSystem(int, int, int *, char **, int);
-
 void         CmiMultipleSend(unsigned int, int, int *, char **);
 void         CmiMultipleIsend(unsigned int, int, int *, char **);
 
index 8f5c84526fa7ce630bed5078795d37f170e9272a..2b0bfb3a75c1f2b3b48926b8bcf51217494fe8fc 100644 (file)
@@ -57,8 +57,6 @@ A more readable summary is at:
 #endif
 
 
-#define ALIGN8(x)       (int)((~7)&((x)+7))
-
 #define DEBUG_GOT_MANAGER 0
 
 typedef Elf32_Addr ELF_TYPE_Addr;
index 1e01a50931a2ec027d44fd878554179ea92f5c4e..02066b3302888ed4e1a2f59d82b5069f3e870740 100644 (file)
@@ -18,7 +18,6 @@
 #define BLKSTART(m) (((CmiChunkHeader *)(m))-1)
 
 //Align data sizes to 8 bytes
-#define ALIGN8(x)            (int)((~7)&((x)+7))
 #define ALIGN8_LONG(x)       (long)((~7)&((x)+7))
 
 //Assuming Size of CmiChunkHeader is a multiple of 8 bytes!!