fix a bug in machine.c
authorYanhua Sun <sun51@illinois.edu>
Fri, 30 Nov 2012 05:07:16 +0000 (23:07 -0600)
committerYanhua Sun <sun51@illinois.edu>
Fri, 30 Nov 2012 05:07:16 +0000 (23:07 -0600)
src/arch/gemini_gni/machine.c
src/arch/util/compress.C [deleted file]
src/arch/util/compress.c [new file with mode: 0644]
src/arch/util/persist-comm.c
src/scripts/Makefile

index 032859bcef706457c9767125fd7dcf109ff31cdc..342fc134873afbc6eafa3adf7467194d18a486dd 100644 (file)
@@ -48,7 +48,7 @@
 #endif
 
 #if !defined(LARGEPAGE)
-#define     LARGEPAGE              0
+#define     LARGEPAGE              1
 #endif
 
 #if CMK_SMP
@@ -2686,7 +2686,7 @@ static void PumpRemoteTransactions(gni_cq_handle_t rx_cqh)
             PersistentReceivesTable *slot = GetIndexAddress(persistPool, index);
             CmiUnlock(persistPool.lock);
             START_EVENT();
-            msg = slot->destBuf[0].destAddress;
+            msg = slot->destBuf[slot->addrIndex].destAddress;
             size = CmiGetMsgSize(msg);
             CmiReference(msg);
             CMI_CHECK_CHECKSUM(msg, size);
diff --git a/src/arch/util/compress.C b/src/arch/util/compress.C
deleted file mode 100644 (file)
index b8d6da0..0000000
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- * =====================================================================================
- *
- *       Filename:  Compress.C
- *
- *    Description: Floating point compression/Decompression algorithm 
- *
- *        Version:  1.0
- *        Created:  09/02/2012 02:53:08 PM
- *       Revision:  none
- *       Compiler:  gcc
- *
- *         Author:  YOUR NAME (), 
- *   Organization:  
- *
- * =====================================================================================
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-#include "compress.h"
-#include "charm++.h"
-#include <limits.h>
-
-#define     SETBIT(dest, i)  (dest[i>>3]) |= (1 << i%8 )
-#define     TESTBIT(dest, i) ((dest[i>>3]) >>  (i%8)) & 1 
-//#define     COMPRESS 1 
-#define     DEBUG  1
-//#define     CHAR_BIT 8
-#define     FLOAT_BIT CHAR_BIT*sizeof(float)
-#define     FLOAT_BYTE sizeof(float)
-
-//#define  COMPRESS_EXP 1
-
-
-#if  COMPRESS_EXP
-
-void compressFloatingPoint(void *src, void *dst, int s, int *compressSize, void *bData) 
-{
-    int size = s/FLOAT_BYTE;
-    float *source = (float*)src;
-    float *dest = (float*)dst;
-    float *baseData = (float*)bData;
-    unsigned int *bptr = (unsigned int*) baseData;
-    unsigned int  *uptr = (unsigned int *) source;
-    char *uchar;
-    int i;
-#if DEBUG
-    double startTimer = CmiWallTimer();
-    printf("[%d]starting compressing.....  orig size:%d ", CmiMyPe(), size);
-#endif
-
-#if !COMPRESS 
-    memcpy(dest, source, size*sizeof(float)); 
-    *compressSize = s;
-#else
-    // Is this the first time we're sending stuff to this node?
-    if (baseData == NULL) {
-        baseData = (float*)malloc(size*sizeof(float));
-        memcpy(baseData, source, size*sizeof(float));
-        memcpy(dest, source, size*sizeof(float)); 
-        *compressSize = s;
-    } else {
-        // Create message to receive the compressed buffer.
-        unsigned char *cdst = (unsigned char*)dest; 
-        int _dataIndex = (size+7)/8;
-        memset(cdst, 0, (size+7)/8 );
-        for (i = 0; i < size; ++i) {
-            // Bitmask everything but the exponents, then check if they match.
-            unsigned int prevExp = bptr[i] & 0x7f800000;
-            unsigned int currExp = uptr[i] & 0x7f800000;
-            if (currExp != prevExp) {
-                // If not, mark this exponent as "different" and store it to send with the message.
-                SETBIT(cdst, i);
-                memcpy(cdst+_dataIndex, &(uptr[i]), 4);
-                _dataIndex += 4;
-            }else
-            {
-                unsigned int ui = uptr[i];
-                ui = (ui << 1) | (ui >> 31);
-                memcpy(cdst+_dataIndex, &ui, 3);
-                _dataIndex += 3;
-            }
-
-        }
-        *compressSize = _dataIndex;
-    }
-#endif
-#if DEBUG
-    printf("[%d] ===>done compressingcompressed size:(%d===>%d) (reduction:%d) ration=%f Timer:%f ms\n\n", CmiMyPe(), size*sizeof(float), *compressSize, (size*sizeof(float)-*compressSize), (1-(float)*compressSize/(size*sizeof(float)))*100, (CmiWallTimer()-startTimer)*1000);
-    //printf(" ===>done compressingcompressed size:(%d===>%d) (reduction:%d) ration=%f \n", size*sizeof(float), *compressSize, (size*sizeof(float)-*compressSize), (1-(float)*compressSize/(size*sizeof(float)))*100);
-#endif
-}
-
-void decompressFloatingPoint(void *cData, void *dData, int s, int compressSize, void *bData) {
-    int size = s/FLOAT_BYTE;
-#if DEBUG
-    double startTimer  = CmiWallTimer();
-    printf("starting decompressing..... ");
-#endif
-#if !COMPRESS
-    memcpy(dData, cData, size*sizeof(float));
-#else
-    float *compressData = (float*)cData;
-    float *decompressData =(float*)dData;
-    float *baseData = (float*)bData;
-    int _sdataIndex = (size+7)/8;
-    char *src = (char*)compressData;
-    int exponent;
-    unsigned int mantissa;
-    unsigned int *bptr = (unsigned int*)baseData;
-    int i;
-    for(i=0; i<size; ++i)
-    {
-       if(TESTBIT(src, i)) // different
-       {
-
-           decompressData[i] = *((float*)(src+_sdataIndex));
-           _sdataIndex += 4;
-       }else        //same exponet
-       {
-           exponent = bptr[i]  & 0x7f800000;
-           mantissa = *((unsigned int*)(src+_sdataIndex)) & 0x00FFFFFF;
-           mantissa = (mantissa >> 1) | (mantissa << 31) ;
-           mantissa |= exponent;
-           decompressData[i] = *((float*)&mantissa);   
-           _sdataIndex += 3;
-       }
-    }
-#endif
-#if DEBUG
-    printf("done decompressing.....  orig size:%d\n time:%f ms", size, (CmiWallTimer()-startTimer)*1000);
-#endif
-
-}
-
-
-#else
-
-#include <bitset>
-#include <vector>
-using namespace std;
-
-void compressFloatingPoint(void *src, void *dst, int s, int *compressSize, void *bData)
-{
-    float *source = (float*)src;
-    float *dest = (float*)dst;
-    float *baseData = (float*)bData;
-    int size = s/sizeof(float);
-#if DEBUG
-    double startTimer = CmiWallTimer();
-    printf("[%d]starting compressing.....  orig size:%d ", CmiMyPe(), size);
-#endif
-    
-#if !COMPRESS 
-    memcpy(dest, source, size*sizeof(float)); 
-    *compressSize = s;
-#else
-    std::bitset<FLOAT_BIT> comp_data;    
-    int index = 0;
-    int f_index = 0;
-    unsigned long tmp;
-    for (int i = 0; i < size; ++i) {
-        std::bitset<FLOAT_BIT> data(*(unsigned long*)(&(source[i])));
-        std::bitset<FLOAT_BIT> prev_data(*(unsigned long*)(&(baseData[i])));
-        std::bitset<FLOAT_BIT> xor_data = data^prev_data;
-        int zers = 0;
-        bool flag = false;
-        for(int b=xor_data.size()-1; b>=0; b--){
-            if(!flag){
-                if(!xor_data[b] && zers<15){
-                    zers++;
-                }
-                else{
-                    flag = true;
-                    std:bitset<4> bs(zers);
-                    for(int j=3;j>=0; j--)
-                    {
-                        comp_data[index++]=bs[j];
-                        if(index == FLOAT_BIT){ tmp = comp_data.to_ulong(); index = 0;  dest[f_index++] = *(float*)(&tmp);}
-                     }
-                        comp_data[index++]=xor_data[b];
-                        if(index == FLOAT_BIT){ tmp = comp_data.to_ulong(); index = 0;  dest[f_index++] = *(float*)(&tmp);}
-                }
-            }
-            else{
-                comp_data[index++]=xor_data[b];
-                if(index == FLOAT_BIT){ tmp = comp_data.to_ulong(); index = 0;  dest[f_index++] = *(float*)(&tmp);}
-            }
-        }
-    }
-    if(index > 0)
-    { tmp = comp_data.to_ulong(); dest[f_index++] = *(float*)(&tmp);}
-
-    *compressSize = f_index*sizeof(float);
-    float compressRatio = (1-(float)(*compressSize)/s)*100;
-    
-#if DEBUG
-    printf("[%d] ===>done compressingcompressed size:(%d===>%d) (reduction:%d) ration=%f Timer:%f ms\n\n", CmiMyPe(), size*sizeof(float), *compressSize, (size*sizeof(float)-*compressSize), (1-(float)*compressSize/(size*sizeof(float)))*100, (CmiWallTimer()-startTimer)*1000);
-#endif
-
-#endif
-}
-
-void decompressFloatingPoint(void *cData, void *dData, int s, int compressSize, void *bData) {
-    int size = s/sizeof(float);
-#if DEBUG
-    double startTimer  = CmiWallTimer();
-    printf("starting decompressing..... ");
-#endif
-#if !COMPRESS
-    memcpy(dData, cData, size*sizeof(float));
-#else
-    float*compData = (float*)cData;
-    float *decompressData = (float*)dData;
-    float *baseData = (float*)bData;
-    int compp = 0;
-    vector<bool>  compressData;
-    std::bitset<FLOAT_BIT> xor_data;
-    std::bitset<FLOAT_BIT> data(0ul);
-    int index = 0;
-    for(int i=0; i<compressSize/sizeof(float); i++)
-    {
-        std::bitset<FLOAT_BIT> cbits(*(unsigned long*) (&(compData[i])));
-        for(int j=0; j<FLOAT_BIT; j++)
-            compressData.push_back(cbits[j]);
-    }
-
-    for (int i=0; i<size; i++) {
-        int index = FLOAT_BIT-1;
-        std::bitset<FLOAT_BIT> prev_data(*(unsigned long*)(&(baseData[i])));
-        //read 4 bits and puts index acccordingly
-        for (int f=3; f>=0; f--,compp++) {
-            if(compressData[compp] == 1){
-                for (int ff=0; ff<pow(2,f); ff++) {
-                    data[index] = 0; index--;
-                }
-            }
-        }
-        while(index>=0){
-            data[index] = compressData[compp];
-            index--; compp++;
-        }
-     
-        xor_data = data^prev_data;
-        unsigned long tmp = xor_data.to_ulong();
-        decompressData[i] = *(reinterpret_cast<float*>(&tmp));
-    }
-
-#if DEBUG
-    printf("done decompressing.....  orig size:%d\n time:%f ms", size, (CmiWallTimer()-startTimer)*1000);
-#endif
-
-#endif
-}
-
-#endif
diff --git a/src/arch/util/compress.c b/src/arch/util/compress.c
new file mode 100644 (file)
index 0000000..7232133
--- /dev/null
@@ -0,0 +1,273 @@
+/*
+ * =====================================================================================
+ *
+ *       Filename:  Compress.C
+ *
+ *    Description: Floating point compression/Decompression algorithm 
+ *
+ *        Version:  1.0
+ *        Created:  09/02/2012 02:53:08 PM
+ *       Revision:  none
+ *       Compiler:  gcc
+ *
+ *         Author:  YOUR NAME (), 
+ *   Organization:  
+ *
+ * =====================================================================================
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+struct timeval tv;
+#include <sys/time.h>
+
+double get_clock()
+{
+       struct timeval tv; int ok;
+       ok = gettimeofday(&tv, NULL);
+       if (ok<0) { printf("gettimeofday error");  }
+       return (tv.tv_sec * 1.0 + tv.tv_usec * 1.0E-6);
+}
+
+#define     COMPRESS 1 
+#define     DEBUG  1
+#define     CHAR_BIT 8
+#define     FLOAT_BIT CHAR_BIT*sizeof(float)
+#define     FLOAT_BYTE sizeof(float)
+
+#define  COMPRESS_EXP 1
+
+
+#if  COMPRESS_EXP
+
+#define     SETBIT(dest, i)  (dest[i>>3]) |= (1 << (i&7) )
+#define     TESTBIT(dest, i) ((dest[i>>3]) >>  (i&7)) & 1 
+
+void compressFloatingPoint(void *src, void *dst, int s, int *compressSize, void *bData)
+{
+    int size = s/FLOAT_BYTE;
+    float *source = (float*)src;
+    float *dest = (float*)dst;
+    float *baseData = (float*)bData;
+    register unsigned int *bptr = (unsigned int*) baseData;
+    register unsigned int  *uptr = (unsigned int *) source;
+    register char *uchar;
+    register int i;
+#if DEBUG
+    double t1 = get_clock();
+#endif
+
+#if !COMPRESS 
+    memcpy(dest, source, size*sizeof(float)); 
+    *compressSize = s;
+#else
+    // Is this the first time we're sending stuff to this node?
+    if (baseData == NULL) {
+        baseData = (float*)malloc(size*sizeof(float));
+        memcpy(baseData, source, size*sizeof(float));
+        memcpy(dest, source, size*sizeof(float)); 
+        *compressSize = s;
+    } else {
+        // Create message to receive the compressed buffer.
+        register unsigned char *cdst = (unsigned char*)dest; 
+        register int _dataIndex = (size+7)/8;
+        memset(cdst, 0, (size+7)/8 );
+        for (i = 0; i < size; ++i) {
+            // Bitmask everything but the exponents, then check if they match.
+            unsigned int prevExp = bptr[i] & 0x7f800000;
+            unsigned int currExp = uptr[i] & 0x7f800000;
+            if (currExp != prevExp) {
+                // If not, mark this exponent as "different" and store it to send with the message.
+                SETBIT(cdst, i);
+                memcpy(cdst+_dataIndex, &(uptr[i]), 4);
+                _dataIndex += 4;
+            }else
+            {
+                unsigned int ui = uptr[i];
+                ui = (ui << 1) | (ui >> 31);
+                memcpy(cdst+_dataIndex, &ui, 3);
+                _dataIndex += 3;
+            }
+
+        }
+        *compressSize = _dataIndex;
+    }
+#endif
+#if DEBUG
+    double t = get_clock()-t1;
+    //printf("[%d] ===>done compressingcompressed size:(%d===>%d) (reduction:%d) ration=%f Timer:%f ms\n\n", CmiMyPe(), size*sizeof(float), *compressSize, (size*sizeof(float)-*compressSize), (1-(float)*compressSize/(size*sizeof(float)))*100, (CmiWallTimer()-startTimer)*1000);
+    printf(" ===>done compressingcompressed size:(%d===>%d) (reduction:%d) ration=%f time=%d us\n", (int)(size*sizeof(float)), *compressSize, (int)(size*sizeof(float)-*compressSize), (1-(float)*compressSize/(size*sizeof(float)))*100, (int)(t*1000000000));
+#endif
+}
+
+void decompressFloatingPoint(void *cData, void *dData, int s, int compressSize, void *bData) {
+    int size = s/FLOAT_BYTE;
+#if DEBUG
+    double t1 = get_clock();
+#endif
+#if !COMPRESS
+    memcpy(dData, cData, size*sizeof(float));
+#else
+    float *compressData = (float*)cData;
+    float *baseData = (float*)bData;
+    register unsigned int *decompressData =(unsigned int*)dData;
+    register int _sdataIndex = (size+7)/8;
+    register char *src = (char*)compressData;
+    register int exponent;
+    register unsigned int mantissa;
+    register unsigned int *bptr = (unsigned int*)baseData;
+    register int i;
+    for(i=0; i<size; ++i)
+    {
+       if(TESTBIT(src, i)) // different
+       {
+
+           decompressData[i] = *((unsigned int*)(src+_sdataIndex));
+           _sdataIndex += 4;
+       }else        //same exponet
+       {
+           exponent = bptr[i]  & 0x7f800000;
+           mantissa = *((unsigned int*)(src+_sdataIndex)) & 0x00FFFFFF;
+           mantissa = (mantissa >> 1) | (mantissa << 31) ;
+           mantissa |= exponent;
+           decompressData[i] = mantissa;   
+           _sdataIndex += 3;
+       }
+    }
+#endif
+#if DEBUG
+    double t = get_clock()-t1;
+    printf("done decompressing.....  orig size:%d\n time:%d us", (int)size, (int)(t*1000000000)) ;
+#endif
+
+}
+
+#else
+
+
+#define TESTBIT(data, b) (data>>(b)) & 1
+#define SETBIT(data, index, bit) (data |= ((bit)<<(index)))
+
+void printbitssimple(int n) {
+    unsigned int i;
+    i = 1<<(sizeof(n) * 8 - 1);
+    
+    while (i > 0) {
+        if (n & i)
+            printf("1");
+        else
+            printf("0");
+        i >>= 1;
+    }
+}
+void compressFloatingPoint(void *src, void *dst, int s, int *compressSize, void *bData)
+{
+    register unsigned int *dest = (unsigned int*)dst;
+    register unsigned int *bptr = (unsigned int*) bData;
+    register unsigned int  *uptr = (unsigned int *) src;
+    int size = s/sizeof(float);
+#if DEBUG
+    double t1 = get_clock();
+#endif
+    
+#if !COMPRESS 
+    memcpy(dest, src, size*sizeof(float));
+    *compressSize = s;
+#else
+    register unsigned int comp_data = 0;
+    register int f_index = 0;
+    register int i;
+    register int j;
+    register int b;
+    register int zers;
+    register unsigned int xor_data;
+    bzero(dest, s);
+    for (i = 0; i < size; ++i) {
+        xor_data = (uptr[i])^(bptr[i]);
+        zers = 0;
+        //int value = xor_data;
+        //printbitssimple(value);
+        //printf("\n\n");
+        b=FLOAT_BIT-1; 
+        while(!TESTBIT(xor_data, b) && zers<15){
+            zers++;
+            b--;
+        }
+        //set the LZC 4 bits
+        for(j=0; j<4; j++)
+        {
+            SETBIT(dest[(int)(f_index>>5)], (f_index&0x1f), TESTBIT(zers, j));
+            f_index++;
+        }
+        while(b>=0)
+        {
+            SETBIT(dest[(f_index>>5)], f_index&0x1f, TESTBIT(xor_data, b));
+            f_index++;
+            b--;
+        } 
+    }
+ /*   for (int k=0; k<f_index; k++) {
+        printf("%e ",dest[k]);
+    }
+   */
+    *compressSize = f_index/8;
+    float compressRatio = (1-(float)(*compressSize)/s)*100;
+    
+#if DEBUG
+    double t = get_clock()-t1;
+    printf("===>done compressing compressed size:(%d===>%d) (reduction:%d) ration=%f Timer:%d us\n\n", (int)(size*sizeof(float)), *compressSize, (int)((size*sizeof(float)-*compressSize)), (1-(float)*compressSize/(size*sizeof(float)))*100, (int)(t*1000000000));
+#endif
+
+#endif
+}
+
+void decompressFloatingPoint(void *cData, void *dData, int s, int compressSize, void *bData) {
+    int size = s/sizeof(float);
+#if DEBUG
+    double t1 = get_clock();
+#endif
+#if !COMPRESS
+    memcpy(dData, cData, size*sizeof(float));
+#else
+    register unsigned int *compressData = (unsigned int*)cData;
+    register unsigned int *decompressData = (unsigned int*)dData;
+    register unsigned int *baseData = (unsigned int*)bData;
+    bzero(decompressData, s);
+    register int index;
+    register unsigned int xor_data;
+    register int data = 0;
+    register int d_index=0;
+    register int compp = 0;
+    register int i;
+    register int j;
+    register int f;
+    for (i=0; i<size; i++) {
+        index = FLOAT_BIT-1;
+        data = 0;
+        //read 4 bits and puts index acccordingly
+        for (f=0; f<4; f++,compp++) {
+            if(TESTBIT(compressData[(int)(compp>>5)], (compp&0x1f))){
+                for (j=0; j < (1<<f); j++) {
+                    SETBIT(data, index, 0);
+                    index--;
+                }
+            }
+        }
+        while(index>=0){
+            SETBIT(data, index, TESTBIT(compressData[(int)(compp>>5)], (compp&0x1f)));
+            index--; compp++;
+        }
+        xor_data = data^(baseData[i]);
+        decompressData[i] = xor_data;
+    }
+
+#if DEBUG
+    double t = get_clock()-t1;
+    printf("done decompressing.....  orig size:%d time:%d us \n", size, (int)(t*1000000000));
+#endif
+
+#endif
+}
+
+#endif
index eb3e989ee3d89ef42066de997aaba26c78f44376..61b407c5aa169f7608bed28e2054c8c6bea55f58 100644 (file)
@@ -10,7 +10,7 @@
 
 #include "converse.h"
 #if CMK_PERSISTENT_COMM
-#include "compress.h"
+#include "compress.c"
 #include "machine-persistent.h"
 
 CpvDeclare(PersistentSendsTable *, persistentSendsTableHead);
@@ -345,6 +345,7 @@ int CompressPersistentMsg(PersistentHandle h, int size, void *msg)
             newSize = size-slot->compressSize+compressSize;
             (((CmiMsgHeaderExt*)msg)->xxhdl) = (((CmiMsgHeaderExt*)msg)->xhdl);
             CldSwitchHandler(msg, persistentDecompressHandlerIdx);
+            //CmiPrintf("\n[%d ] finish compressing \n", CmiMyPe() );
         }
         free(dest);
     }
index 1b8639ed0d9676d27f55893c331af143436f4a3c..47779813622e4d60b5b68479decbc959b52f9b66 100644 (file)
@@ -422,7 +422,7 @@ LIBCONV_UTIL=pup_util.o pup_toNetwork.o pup_toNetwork4.o            \
        pup_xlater.o pup_c.o pup_paged.o pup_cmialloc.o                 \
        ckimage.o ckdll.o ckhashtable.o sockRoutines.o                  \
        conv-lists.o RTH.o persist-comm.o mempool.o graph.o \
-       TopoManager.o CrayNid.o crc32.o compress.o
+       TopoManager.o CrayNid.o crc32.o 
 
 LIBCONV_UTILF=pup_f.o
 
@@ -464,7 +464,6 @@ include Makefile.machine
 $(L)/libconv-cplus-n.a: machine.c $(CVHEADERS)
        @-test -f $(INC)/mpi.h && mv -f $(INC)/mpi.h $(INC)/mpi.BAK || true
        $(CHARMC) -o machine.o  -DFOR_CPLUS=1 machine.c
-       $(CHARMC) -o compress.o  -DFOR_CPLUS=1 compress.C
        @-test -f ./bglmachine.C && $(CHARMC) -o machine.o  -DFOR_CPLUS=1 bglmachine.C || true
        $(CHARMC) -o $(L)/libconv-cplus-y.a machine.o
        $(CHARMC) -o $(L)/libconv-cplus-n.a -DFOR_CPLUS=0 machine.c