Changeset: 70bcd9bc5033 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=70bcd9bc5033
Modified Files:
        geom/monetdb5/grid.c
Branch: grid
Log Message:

compute the distance join using cache blocking


diffs (135 lines):

diff --git a/geom/monetdb5/grid.c b/geom/monetdb5/grid.c
--- a/geom/monetdb5/grid.c
+++ b/geom/monetdb5/grid.c
@@ -28,11 +28,11 @@
 
 #define maximumNumberOfCells(max, bitsNum, add) \
 do {                                            \
-    int i = 0;                                  \
-    size_t res = 0;                             \
-    for(i = 0; i < bitsNum; i++)                \
-        res = (res << 1) | 1;                   \
-    max = res + add;                            \
+       int i = 0;                                  \
+       size_t res = 0;                             \
+       for(i = 0; i < bitsNum; i++)                \
+               res = (res << 1) | 1;                   \
+       max = res + add;                            \
 } while (0)
 
 #define GRIDextend(g1, g2, cellR, cellS, r1, r2, msg)                          
    \
@@ -41,54 +41,75 @@ do {                                    
 BUN maxSize = BATcount((r1)) +                                                 
    \
               ((g1)->dir[(cellR)+1]-(g1)->dir[(cellR)])*                       
    \
               ((g2)->dir[(cellS)+1]-(g2)->dir[(cellS)]);                       
    \
-if (maxSize > GDK_oid_max) {                                                   
    \
-               (msg) = createException(MAL, "grid.distance", "overflow of head 
value");   \
-               goto distancejoin_fail;                                         
           \
-}                                                                              
    \
-while (maxSize > BATcapacity((r1))) {                                          
    \
-fprintf(stderr, "maxSize: %zu capacity: %zu\n", maxSize, BATcapacity((r1)));   
    \
-       if ((BATextend((r1), BATgrows((r1))) != GDK_SUCCEED) ||                 
       \
-               (BATextend((r2), BATgrows((r2))) != GDK_SUCCEED)) {             
           \
-               (msg) = createException(MAL, "grid.distance",                   
           \
-                            "could not extend BATs for storing the join 
results"); \
-               goto distancejoin_fail;                                         
           \
+       if (maxSize > GDK_oid_max) {                                            
       \
+                       (msg) = createException(MAL,"grid.distance","overflow 
of head value"); \
+                       goto distancejoin_fail;                                 
               \
        }                                                                       
       \
-}                                                                              
    \
+       while (maxSize > BATcapacity((r1))) {                                   
       \
+               if ((BATextend((r1), BATgrows((r1))) != GDK_SUCCEED) ||         
           \
+                       (BATextend((r2), BATgrows((r2))) != GDK_SUCCEED)) {     
               \
+                       (msg) = createException(MAL, "grid.distance",           
               \
+                                       "could not extend BATs for storing the 
join results");         \
+                       goto distancejoin_fail;                                 
               \
+               }                                                               
           \
+       }                                                                       
       \
 } while (0)
 
-
+#define GRIDdist(r1Vals, oid1, seq1, r1b, x1v, y1v,                            
   \
+                 r2Vals, oid2, seq2, r2b, x2v, y2v)                            
   \
+do {                                                                           
   \
+       dbl ddist = ((x2v)-(x1v))*((x2v)-(x1v))+((y2v)-(y1v))*((y2v)-(y1v));    
      \
+       (r1Vals)[(r1b)] = (oid1) + (seq1);                                      
      \
+       (r2Vals)[(r2b)] = (oid2) + (seq2);                                      
      \
+       (r1b) += ddist <= distsqr;                                              
      \
+       (r2b) += ddist <= distsqr;                                              
      \
+} while(0)
 
 #define GRIDcmp(x1Vals, y1Vals, g1,                                            
   \
                 x2Vals, y2Vals, g2,                                            
   \
                 cellR, cellS, r1, r2, seq1, seq2, msg)                         
   \
 do {                                                                           
   \
-BUN r1b, r2b;                                                                  
   \
-lng * r1Vals, * r2Vals;                                                        
   \
-if ((cellR) >= (g1)->cellsNum || (cellS) >= (g2)->cellsNum)                    
   \
-       continue;                                                               
      \
-GRIDextend(g1, g2, cellR, cellS, r1, r2, msg);                                 
   \
-r1Vals = (lng*)Tloc(r1, BUNfirst(r1));                                         
   \
-r2Vals = (lng*)Tloc(r2, BUNfirst(r2));                                         
   \
-r1b = BATcount(r1);                                                            
   \
-r2b = BATcount(r2);                                                            
   \
-/* compare points of R in cellR with points of S in cellS */                   
   \
-for (size_t m = (g1)->dir[(cellR)]; m < (g1)->dir[(cellR)+1]; m++) {           
   \
-       oid oid1 = m;                                                           
      \
-       lng x1v = (x1Vals)[oid1];                                               
      \
-       lng y1v = (y1Vals)[oid1];                                               
      \
-       for (size_t n = (g2)->dir[(cellS)]; n < (g2)->dir[(cellS)+1]; n++) {    
      \
-               size_t oid2 = n;                                                
          \
-               lng x2v = (x2Vals)[oid2];                                       
          \
-               lng y2v = (y2Vals)[oid2];                                       
          \
-               double ddist = (x2v-x1v)*(x2v-x1v)+(y2v-y1v)*(y2v-y1v);         
          \
-               r1Vals[r1b] = oid1 + seq1;                                      
          \
-               r2Vals[r2b] = oid2 + seq2;                                      
          \
-               r1b += ddist <= distsqr;                                        
          \
-               r2b += ddist <= distsqr;                                        
          \
+       BUN r1b, r2b;                                                           
      \
+       oid m;                                                                  
      \
+       lng * r1Vals, * r2Vals;                                                 
      \
+       if ((cellR) >= (g1)->cellsNum || (cellS) >= (g2)->cellsNum)             
      \
+               continue;                                                       
          \
+       GRIDextend(g1, g2, cellR, cellS, r1, r2, msg);                          
      \
+       r1Vals = (lng*)Tloc(r1, BUNfirst(r1));                                  
      \
+       r2Vals = (lng*)Tloc(r2, BUNfirst(r2));                                  
      \
+       r1b = BATcount(r1);                                                     
      \
+       r2b = BATcount(r2);                                                     
      \
+       m = (g1)->dir[(cellR)];                                                 
      \
+       if (GRIDcount(g1, cellR) > 16) {                                        
      \
+               /* compare points of R in cellR with points of S in cellS */    
          \
+               for (m = (g1)->dir[(cellR)]; m < (g1)->dir[(cellR)+1]-16; 
m+=16) {        \
+                       for (oid n = (g2)->dir[(cellS)]; n < 
(g2)->dir[(cellS)+1]; n++) {     \
+                               oid oid2 = n;                                   
                  \
+                               lng x2v = (x2Vals)[oid2];                       
                  \
+                               lng y2v = (y2Vals)[oid2];                       
                  \
+                               for(oid oid1 = m; oid1 < m+16; oid1++) {        
                  \
+                                       lng x1v = (x1Vals)[oid1];               
                      \
+                                       lng y1v = (y1Vals)[oid1];               
                      \
+                                       GRIDdist(r1Vals, oid1, seq1, r1b, x1v, 
y1v,                   \
+                                                        r2Vals, oid2, seq2, 
r2b, x2v, y2v);                  \
+                               }                                               
                  \
+                       }                                                       
              \
+               }                                                               
          \
        }                                                                       
      \
-}                                                                              
   \
-BATsetcount(r1, r1b);                                                          
   \
-BATsetcount(r2, r2b);                                                          
   \
+       for (; m < (g1)->dir[(cellR)+1]; m++) {                                 
      \
+               oid oid1 = m;                                                   
          \
+               lng x1v = (x1Vals)[oid1];                                       
          \
+               lng y1v = (y1Vals)[oid1];                                       
          \
+               for (oid n = (g2)->dir[(cellS)]; n < (g2)->dir[(cellS)+1]; n++) 
{         \
+                       oid oid2 = n;                                           
              \
+                       lng x2v = (x2Vals)[oid2];                               
              \
+                       lng y2v = (y2Vals)[oid2];                               
              \
+                       GRIDdist(r1Vals, oid1, seq1, r1b, x1v, y1v,             
              \
+                                        r2Vals, oid2, seq2, r2b, x2v, y2v);    
                      \
+               }                                                               
          \
+       }                                                                       
      \
+       BATsetcount(r1, r1b);                                                   
      \
+       BATsetcount(r2, r2b);                                                   
      \
 } while (0)
 
 typedef struct Grid Grid;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to