Changeset: 2e1fc2354772 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2e1fc2354772
Modified Files:
        geom/monetdb5/geom.c
        geom/monetdb5/geom.h
Branch: sfcgal
Log Message:

OpenMP for filter joins


diffs (truncated from 469 to 300 lines):

diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c
--- a/geom/monetdb5/geom.c
+++ b/geom/monetdb5/geom.c
@@ -12,6 +12,7 @@
  */
 
 #include "geom.h"
+#define GEOMBULK_DEBUG 1
 
 int TYPE_mbr;
 
@@ -8132,6 +8133,10 @@ WKBWKBtoBITsubjoin_intern(bat *lres, bat
     int *rSRIDs = NULL;
     str msg = MAL_SUCCEED;
     bit* outs = NULL;
+#ifdef GEOMBULK_DEBUG
+    static struct timeval start, stop;
+    unsigned long long t;
+#endif
 
        if( (bl= BATdescriptor(*lid)) == NULL )
                throw(MAL, name, RUNTIME_OBJECT_MISSING);
@@ -8193,31 +8198,43 @@ WKBWKBtoBITsubjoin_intern(bat *lres, bat
                BBPunfix(xr->batCacheid);
                throw(MAL, name, MAL_MALLOC_FAIL);
     }
+#ifdef GEOMBULK_DEBUG
+    gettimeofday(&start, NULL);
+#endif
     BATloop(br, pr, qr) {
         wkb *rWKB = (wkb *) BUNtail(rBAT_iter, pr);
+
+        if (msg != MAL_SUCCEED)
+            continue;
+
         rGeometries[pr] = wkb2geos(rWKB);
         if (!rGeometries[pr] ) {
-            for (j = 0; j < pr-1;j++) {
-                GEOSGeom_destroy(rGeometries[j]);
-            }
                msg = createException(MAL, name, "wkb2geos failed");
             break;
         }
         rMBRs[pr] = mbrFromGeos(rGeometries[pr]);
-        if (rMBRs[pr] == NULL || mbr_isnil(rMBRs[pr])) {
-            for (j = 0; j < pr;j++) {
-                GEOSGeom_destroy(rGeometries[j]);
-            }
+        //if (rMBRs[pr] == NULL || mbr_isnil(rMBRs[pr])) {
+        if (mbr_isnil(rMBRs[pr])) {
             msg = createException(MAL, name, "Failed to create mbrFromGeos");
-            return msg;
+            break;
         }
-        rSRIDs[pr] = GEOSGetSRID(rGeometries[pr]);
-    }
+        //rSRIDs[pr] = GEOSGetSRID(rGeometries[pr]);
+        rSRIDs[pr] = rWKB->srid;
+    }
+#ifdef GEOMBULK_DEBUG
+    gettimeofday(&stop, NULL);
+    t = 1000 * (stop.tv_sec - start.tv_sec) + (stop.tv_usec - start.tv_usec) / 
1000;
+    fprintf(stdout, "%s first BATloop %llu ms\n", name, t);
+#endif
     if ( (msg ==MAL_SUCCEED) && BATcount(br) && (outs = (bit*) 
GDKzalloc(sizeof(bit)*BATcount(br))) == NULL) {
         msg = createException(MAL, name, MAL_MALLOC_FAIL);
     }
 
     if (msg != MAL_SUCCEED) {
+        for (j = 0; j < pr;j++) {
+            if (rGeometries[j])
+                GEOSGeom_destroy(rGeometries[j]);
+        }
         GDKfree(rMBRs);
         GDKfree(rSRIDs);
         GDKfree(rGeometries);
@@ -8228,6 +8245,9 @@ WKBWKBtoBITsubjoin_intern(bat *lres, bat
         return msg;
     }
 
+#ifdef GEOMBULK_DEBUG
+    gettimeofday(&start, NULL);
+#endif
     lo = bl->hseqbase;
     BATloop(bl, pl, ql) {
                str err = NULL;
@@ -8253,9 +8273,11 @@ WKBWKBtoBITsubjoin_intern(bat *lres, bat
         }
 
         //for (j = 0; j < BATcount(br); j++, ro++) {
+#ifdef OPENMP
         omp_set_dynamic(OPENCL_DYNAMIC);     // Explicitly disable dynamic 
teams
         omp_set_num_threads(OPENCL_THREADS);
-        //#pragma omp parallel for
+        #pragma omp parallel for
+#endif
         for (j = 0; j < BATcount(br); j++) {
             mbr *rMBR = NULL;
                GEOSGeom rGeometry = rGeometries[j];
@@ -8266,7 +8288,11 @@ WKBWKBtoBITsubjoin_intern(bat *lres, bat
 
             if (lSRID != rSRIDs[j]) {
                 msg = createException(MAL, name, "Geometries of different 
SRID");
+#ifdef OPENMP
+                #pragma omp cancelregion
+#else
                 break;
+#endif
             }
 
             rMBR = rMBRs[j]; 
@@ -8277,8 +8303,11 @@ WKBWKBtoBITsubjoin_intern(bat *lres, bat
                 outs[j] = 0;
                 if ((outs[j] = (*func)(lGeometry, rGeometry)) == 2){
                     msg = createException(MAL, name, "%s failed", name);
-                    //#pragma omp cancelregion
+#ifdef OPENMP
+                    #pragma omp cancelregion
+#else
                     break;
+#endif
                 }
             }
         }
@@ -8300,6 +8329,11 @@ WKBWKBtoBITsubjoin_intern(bat *lres, bat
         }
         lo++;
        }
+#ifdef GEOMBULK_DEBUG
+    gettimeofday(&stop, NULL);
+    t = 1000 * (stop.tv_sec - start.tv_sec) + (stop.tv_usec - start.tv_usec) / 
1000;
+    fprintf(stdout, "%s second BATloop %llu ms\n", name, t);
+#endif
     if (outs)
         GDKfree(outs);
     if (rGeometries) {
@@ -8358,6 +8392,10 @@ IntersectsXYZsubjoin_intern(bat *lres, b
        GEOSGeom *rGeometries = NULL;
     mbr **rMBRs = NULL;
     bit *outs = NULL;
+#ifdef GEOMBULK_DEBUG
+    static struct timeval start, stop;
+    unsigned long long t;
+#endif
 
        if( (bl= BATdescriptor(*lid)) == NULL )
                throw(MAL, "algebra.Intersects", RUNTIME_OBJECT_MISSING);
@@ -8435,6 +8473,9 @@ IntersectsXYZsubjoin_intern(bat *lres, b
                BBPunfix(xr->batCacheid);
                throw(MAL, "algebra.Intersects", MAL_MALLOC_FAIL);
     }
+#ifdef GEOMBULK_DEBUG
+    gettimeofday(&start, NULL);
+#endif
     BATloop(bx, px, qx) {
         GEOSGeom rGeos = NULL;
         mbr *rMBR = NULL;
@@ -8494,6 +8535,11 @@ IntersectsXYZsubjoin_intern(bat *lres, b
         rGeometries[px] = rGeos;
         rMBRs[px] = rMBR;
     }
+#ifdef GEOMBULK_DEBUG
+    gettimeofday(&stop, NULL);
+    t = 1000 * (stop.tv_sec - start.tv_sec) + (stop.tv_usec - start.tv_usec) / 
1000;
+    fprintf(stdout, "IntersectsXYZ first BATloop %llu ms\n", t);
+#endif
     if ( (msg ==MAL_SUCCEED) && BATcount(bx) && (outs = (bit*) 
GDKzalloc(sizeof(bit)*BATcount(bx))) == NULL) {
         msg = createException(MAL, "algebra.Intersects", MAL_MALLOC_FAIL);
     }
@@ -8511,6 +8557,9 @@ IntersectsXYZsubjoin_intern(bat *lres, b
     }
 
     lo = bl->hseqbase;
+#ifdef GEOMBULK_DEBUG
+    gettimeofday(&start, NULL);
+#endif
     BATloop(bl, pl, ql) {
         str err = NULL;
         wkb *lWKB = NULL;
@@ -8543,9 +8592,11 @@ IntersectsXYZsubjoin_intern(bat *lres, b
         }
 
         //for (j = 0; j < BATcount(bx); j++, ro++) {
+#ifdef OPENMP
         omp_set_dynamic(OPENCL_DYNAMIC);     // Explicitly disable dynamic 
teams
         omp_set_num_threads(OPENCL_THREADS);
-        //#pragma omp parallel for
+        #pragma omp parallel for
+#endif
         for (j = 0; j < BATcount(bx); j++) {
                GEOSGeom rGeometry = rGeometries[j];
             outs[j] = 0;
@@ -8556,14 +8607,20 @@ IntersectsXYZsubjoin_intern(bat *lres, b
             //if (GEOSGetSRID(lGeometry) != GEOSGetSRID(rGeometry)) {
                if ( (err = mbrOverlaps(&outs[j], &lMBR, &rMBRs[j])) != 
MAL_SUCCEED) {
                 msg = err;
+#ifdef OPENMP
+                #pragma omp cancelregion
+#else
                 break;
-                //#pragma omp cancelregion
+#endif
             } else if (outs[j]) {
                 outs[j] = 0;
                 if ((outs[j] = GEOSIntersects(lGeometry, rGeometry)) == 2){
                     msg = createException(MAL, "geom.Intersects", 
"GEOSIntersects failed");
+#ifdef OPENMP
+                    #pragma omp cancelregion
+#else
                     break;
-                    //#pragma omp cancelregion
+#endif
                 }
             }
         }
@@ -8582,6 +8639,11 @@ IntersectsXYZsubjoin_intern(bat *lres, b
         }
         lo++;
        }
+#ifdef GEOMBULK_DEBUG
+    gettimeofday(&stop, NULL);
+    t = 1000 * (stop.tv_sec - start.tv_sec) + (stop.tv_usec - start.tv_usec) / 
1000;
+    fprintf(stdout, "IntersectsXYZ second BATloop %llu ms\n", t);
+#endif
     if (outs)
         GDKfree(outs);
     if (rGeometries) {
@@ -8631,6 +8693,10 @@ DWithinsubjoin_intern(bat *lres, bat *rr
        GEOSGeom *rGeometries = NULL;
     int *rSRIDs = NULL;
     bit *outs = NULL;
+#ifdef GEOMBULK_DEBUG
+    static struct timeval start, stop;
+    unsigned long long t;
+#endif
 
        if( (bl= BATdescriptor(*lid)) == NULL )
                throw(MAL, "algebra.DWithin", RUNTIME_OBJECT_MISSING);
@@ -8682,6 +8748,9 @@ DWithinsubjoin_intern(bat *lres, bat *rr
                BBPunfix(xr->batCacheid);
                throw(MAL, "algebra.DWithin", MAL_MALLOC_FAIL);
     }
+#ifdef GEOMBULK_DEBUG
+    gettimeofday(&start, NULL);
+#endif
     BATloop(br, pr, qr) {
         wkb *rWKB = (wkb *) BUNtail(rBAT_iter, pr);
         rGeometries[pr] = wkb2geos(rWKB);
@@ -8698,10 +8767,18 @@ DWithinsubjoin_intern(bat *lres, bat *rr
         }
         rSRIDs[pr] = GEOSGetSRID(rGeometries[pr]);
     }
+#ifdef GEOMBULK_DEBUG
+    gettimeofday(&stop, NULL);
+    t = 1000 * (stop.tv_sec - start.tv_sec) + (stop.tv_usec - start.tv_usec) / 
1000;
+    fprintf(stdout, "DWithin first BATloop %llu ms\n", t);
+#endif
     if ( (msg == MAL_SUCCEED) && BATcount(br) && (outs = (bit*) 
GDKzalloc(sizeof(bit)*BATcount(br))) == NULL) {
         msg = createException(MAL,  "algebra.DWithin", MAL_MALLOC_FAIL);
     }
 
+#ifdef GEOMBULK_DEBUG
+    gettimeofday(&start, NULL);
+#endif
     lo = bl->hseqbase;
     BATloop(bl, pl, ql) {
         wkb *lWKB = NULL;
@@ -8719,9 +8796,11 @@ DWithinsubjoin_intern(bat *lres, bat *rr
         lSRID = GEOSGetSRID(lGeometry);
 
         //for (j = 0; j < BATcount(br); j++, ro++) {
+#ifdef OPENMP
         omp_set_dynamic(OPENCL_DYNAMIC);     // Explicitly disable dynamic 
teams
         omp_set_num_threads(OPENCL_THREADS);
-        //#pragma omp parallel for
+        #pragma omp parallel for
+#endif
         for (j = 0; j < BATcount(br); j++) {
             double distance;
             int res = 0;
@@ -8733,14 +8812,20 @@ DWithinsubjoin_intern(bat *lres, bat *rr
 
             if (lSRID != rSRIDs[j]) {
                 msg = createException(MAL, "geom.DWithin", "Geometries of 
different SRID");
-                //#pragma omp cancelregion
+#ifdef OPENMP
+                #pragma omp cancelregion
+#else
                 break;
+#endif
             }
 
             if ( (res = GEOSDistance(lGeometry, rGeometry, &distance)) == 0) {
                 msg = createException(MAL, "geom.DWithin", "GEOSDistance 
failed");
-                //#pragma omp cancelregion
+#ifdef OPENMP
+                #pragma omp cancelregion
+#else
                 break;
+#endif
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to