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