modified the interface, added a new possibility of Cmi VectorSends to pack inside
authorFilippo Gioachin <gioachin@illinois.edu>
Sat, 16 Apr 2005 08:12:10 +0000 (08:12 +0000)
committerFilippo Gioachin <gioachin@illinois.edu>
Sat, 16 Apr 2005 08:12:10 +0000 (08:12 +0000)
the message also the CmiChunkHeader allocated with every CmiAlloc

src/arch/template/machine.c
src/conv-core/convcore.c
src/conv-core/converse.h

index 215ce46ab5625afc9222ae3443a2cdbcc9aa0831..71509b5135776d4885778b32c5d7bf14fb09503a 100644 (file)
@@ -68,9 +68,9 @@ void          CmiFreeMulticastFn(CmiGroup, int, char*);
 #endif
 
 #if ! CMK_VECTOR_SEND_USES_COMMON_CODE
 #endif
 
 #if ! CMK_VECTOR_SEND_USES_COMMON_CODE
-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);
 #endif
 
 
 #endif
 
 
index e8c08ceffa576f1725916988a91f5ea31b59a478..95703162758ced59d037a20a08c34903d389a72d 100644 (file)
@@ -1482,44 +1482,68 @@ void CsdInit(argv)
  *
  * Vector Send
  *
  *
  * Vector Send
  *
+ * All the buffers are padded to 8 bytes. This helps in most systems where
+ * analigned memory either does not work, or works slowly.
+ *
+ * The last parameter "system" is by default at zero, in which case the normal
+ * messages are sent. If it is set to 1, the CmiChunkHeader prepended to every
+ * CmiAllocced message will also be sent (except for the first one). Useful for
+ * AllToAll communication, and other system features.
+ *
  ****************************************************************************/
 
  ****************************************************************************/
 
+#define PAD8(x)    ((x+0x07)&(~0x07))
+
 #if CMK_VECTOR_SEND_USES_COMMON_CODE
 
 #if CMK_VECTOR_SEND_USES_COMMON_CODE
 
-void CmiSyncVectorSend(destPE, n, sizes, msgs)
+void CmiSyncVectorSendSystem(destPE, n, sizes, msgs, system)
 int destPE, n;
 int *sizes;
 char **msgs;
 int destPE, n;
 int *sizes;
 char **msgs;
+int system;
 {
   int i, total;
   char *mesg, *tmp;
   
 {
   int i, total;
   char *mesg, *tmp;
   
-  for(i=0,total=0;i<n;i++) total += sizes[i];
+  for(i=0,total=0;i<n;i++) total += PAD8(sizes[i]);
+  if (system) total += (n-1)*sizeof(CmiChunkHeader);
   mesg = (char *) CmiAlloc(total);
   mesg = (char *) CmiAlloc(total);
-  for(i=0,tmp=mesg;i<n;i++) {
-    memcpy(tmp, msgs[i],sizes[i]);
-    tmp += sizes[i];
+  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 += PAD8(sizes[i]);
+    }
   }
   CmiSyncSendAndFree(destPE, total, mesg);
 }
 
   }
   CmiSyncSendAndFree(destPE, total, mesg);
 }
 
-CmiCommHandle CmiAsyncVectorSend(destPE, n, sizes, msgs)
+CmiCommHandle CmiAsyncVectorSendSystem(destPE, n, sizes, msgs, system)
 int destPE, n;
 int *sizes;
 char **msgs;
 int destPE, n;
 int *sizes;
 char **msgs;
+int system;
 {
 {
-  CmiSyncVectorSend(destPE,n,sizes,msgs);
+  CmiSyncVectorSendSystem(destPE,n,sizes,msgs,system);
   return NULL;
 }
 
   return NULL;
 }
 
-void CmiSyncVectorSendAndFree(destPE, n, sizes, msgs)
+void CmiSyncVectorSendAndFreeSystem(destPE, n, sizes, msgs, system)
 int destPE, n;
 int *sizes;
 char **msgs;
 int destPE, n;
 int *sizes;
 char **msgs;
+int system;
 {
   int i;
 
 {
   int i;
 
-  CmiSyncVectorSend(destPE,n,sizes,msgs);
+  CmiSyncVectorSendSystem(destPE,n,sizes,msgs,system);
   for(i=0;i<n;i++) CmiFree(msgs[i]);
   CmiFree(sizes);
   CmiFree(msgs);
   for(i=0;i<n;i++) CmiFree(msgs[i]);
   CmiFree(sizes);
   CmiFree(msgs);
@@ -1527,6 +1551,18 @@ char **msgs;
 
 #endif
 
 
 #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
 /*****************************************************************************
  *
  * Multicast groups
@@ -1767,11 +1803,6 @@ void CmiMulticastInit()
  ***************************************************************************/
 
 
  ***************************************************************************/
 
 
-/* Given a user chunk m, extract the enclosing chunk header fields: */
-#define SIZEFIELD(m) (((CmiChunkHeader *)(m))[-1].size)
-#define REFFIELD(m) (((CmiChunkHeader *)(m))[-1].ref)
-#define BLKSTART(m) (((CmiChunkHeader *)(m))-1)
-
 void *CmiAlloc(int size)
 {
   char *res;
 void *CmiAlloc(int size)
 {
   char *res;
index 12698b9ef150e940f841f0c95967227df913648b..f9004a569dabf39456e24d954d9a96da16aa2d3a 100644 (file)
@@ -486,6 +486,11 @@ typedef struct {
   int ref;
 } CmiChunkHeader;
 
   int ref;
 } CmiChunkHeader;
 
+/* Given a user chunk m, extract the enclosing chunk header fields: */
+#define SIZEFIELD(m) (((CmiChunkHeader *)(m))[-1].size)
+#define REFFIELD(m) (((CmiChunkHeader *)(m))[-1].ref)
+#define BLKSTART(m) (((CmiChunkHeader *)(m))-1)
+
 void    *CmiAlloc(int size);
 void     CmiReference(void *blk);
 int      CmiSize(void *blk);
 void    *CmiAlloc(int size);
 void     CmiReference(void *blk);
 int      CmiSize(void *blk);
@@ -759,9 +764,15 @@ void          CmiSyncMulticastFn(CmiGroup, int, char*);
 CmiCommHandle CmiAsyncMulticastFn(CmiGroup, int, char*);
 void          CmiFreeMulticastFn(CmiGroup, int, char*);
 
 CmiCommHandle CmiAsyncMulticastFn(CmiGroup, int, char*);
 void          CmiFreeMulticastFn(CmiGroup, int, char*);
 
+/* This first version has the default system parameter to 0 */
 void          CmiSyncVectorSend(int, int, int *, char **);
 CmiCommHandle CmiAsyncVectorSend(int, int, int *, char **);
 void          CmiSyncVectorSendAndFree(int, int, int *, char **);
 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 **);
 
 void         CmiMultipleSend(unsigned int, int, int *, char **);
 void         CmiMultipleIsend(unsigned int, int, int *, char **);