Changeset: 6bd80247ea50 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6bd80247ea50
Modified Files:
geom/monetdb5/geomBulk.c
Branch: sfcgal
Log Message:
OpenMP for most of the Bulk operators
diffs (truncated from 969 to 300 lines):
diff --git a/geom/monetdb5/geomBulk.c b/geom/monetdb5/geomBulk.c
--- a/geom/monetdb5/geomBulk.c
+++ b/geom/monetdb5/geomBulk.c
@@ -13,6 +13,10 @@
#include "geom.h"
#include <omp.h>
+#define GEOMBULK_DEBUG 0
+#define OPENCL_DYNAMIC 0
+#define OPENCL_THREADS 1
+
/*******************************/
/********** One input **********/
/*******************************/
@@ -21,9 +25,14 @@ str
geom_2_geom_bat(bat *outBAT_id, bat *inBAT_id, int *columnType, int
*columnSRID)
{
BAT *outBAT = NULL, *inBAT = NULL;
- wkb *inWKB = NULL, *outWKB = NULL;
BUN p = 0, q = 0;
BATiter inBAT_iter;
+ wkb **outs = NULL;
+ str msg = MAL_SUCCEED;
+#ifdef GEOMBULK_DEBUG
+ static struct timeval start, stop;
+ unsigned long long t;
+#endif
//get the descriptor of the BAT
if ((inBAT = BATdescriptor(*inBAT_id)) == NULL) {
@@ -38,30 +47,67 @@ geom_2_geom_bat(bat *outBAT_id, bat *inB
//iterator over the BAT
inBAT_iter = bat_iterator(inBAT);
- //for (i = 0; i < BATcount(inBAT); i++) {
- BATloop(inBAT, p, q) { //iterate over all valid elements
+
+ omp_set_dynamic(OPENCL_DYNAMIC); // Explicitly disable dynamic teams
+ omp_set_num_threads(OPENCL_THREADS);
+ q = BUNlast(inBAT);
+#ifdef GEOMBULK_DEBUG
+ fprintf(stdout, "batcalc.wkb %d %d\n", p, q);
+ gettimeofday(&start, NULL);
+#endif
+ outs = (wkb**) GDKmalloc(sizeof(wkb*) * BATcount(inBAT));
+ //BATloop(inBAT, p, q) { //iterate over all valid elements
+ #pragma omp parallel for
+ for (p = 0; p < q; p++) {
str err = NULL;
+ wkb *inWKB = NULL, *outWKB = NULL;
//if for used --> inWKB = (wkb *) BUNtail(inBATi, i +
BUNfirst(inBAT));
inWKB = (wkb *) BUNtail(inBAT_iter, p);
if ((err = geom_2_geom(&outWKB, &inWKB, columnType,
columnSRID)) != MAL_SUCCEED) { //check type
- BBPunfix(inBAT->batCacheid);
- BBPunfix(outBAT->batCacheid);
- return err;
+ msg = err;
+ #pragma omp cancelregion
}
- BUNappend(outBAT, outWKB, TRUE); //add the point to the
new BAT
- GDKfree(outWKB);
- outWKB = NULL;
+ outs[p] = outWKB;
+ //BUNappend(outBAT, outWKB, TRUE); //add the point to the
new BAT
+ //GDKfree(outWKB);
+ //outWKB = NULL;
}
+#ifdef GEOMBULK_DEBUG
+ gettimeofday(&stop, NULL);
+ t = 1000 * (stop.tv_sec - start.tv_sec) + (stop.tv_usec - start.tv_usec) /
1000;
+ fprintf(stdout, "batcalc.wkb %llu ms\n", t);
+#endif
- //set some properties of the new BAT
+ BBPunfix(inBAT->batCacheid);
+
+ if (msg != MAL_SUCCEED) {
+ BBPunfix(outBAT->batCacheid);
+ return msg;
+ }
+
+#ifdef GEOMBULK_DEBUG
+ gettimeofday(&start, NULL);
+#endif
+ for (p = 0; p < q; p++) {
+ BUNappend(outBAT, outs[p], TRUE); //add the point to the
new BAT
+ GDKfree(outs[p]);
+ outs[p] = NULL;
+ }
+
+ if (outs)
+ GDKfree(outs);
+#ifdef GEOMBULK_DEBUG
+ gettimeofday(&stop, NULL);
+ t = 1000 * (stop.tv_sec - start.tv_sec) + (stop.tv_usec - start.tv_usec) /
1000;
+ fprintf(stdout, "batcalc.wkb BUNappend %llu ms\n", t);
+#endif
+
BATsetcount(outBAT, BATcount(inBAT));
- BATsettrivprop(outBAT);
BATderiveProps(outBAT, FALSE);
- BBPunfix(inBAT->batCacheid);
BBPkeepref(*outBAT_id = outBAT->batCacheid);
+
return MAL_SUCCEED;
-
}
/*create WKB from WKT */
@@ -118,9 +164,14 @@ wkbCoordinateFromMBR_bat(bat *outBAT_id,
{
BAT *outBAT = NULL, *inBAT = NULL;
mbr *inMBR = NULL;
- double outDbl = 0.0;
BUN p = 0, q = 0;
BATiter inBAT_iter;
+ str msg = MAL_SUCCEED;
+#ifdef GEOMBULK_DEBUG
+ static struct timeval start, stop;
+ unsigned long long t;
+#endif
+ double *outs;
//get the descriptor of the BAT
if ((inBAT = BATdescriptor(*inBAT_id)) == NULL) {
@@ -135,26 +186,50 @@ wkbCoordinateFromMBR_bat(bat *outBAT_id,
//iterator over the BAT
inBAT_iter = bat_iterator(inBAT);
- BATloop(inBAT, p, q) { //iterate over all valid elements
+
+ omp_set_dynamic(OPENCL_DYNAMIC); // Explicitly disable dynamic teams
+ omp_set_num_threads(OPENCL_THREADS);
+ q = BUNlast(inBAT);
+#ifdef GEOMBULK_DEBUG
+ fprintf(stdout, "batgeom.coordinateFromMBR %d %d\n", p, q);
+ gettimeofday(&start, NULL);
+#endif
+ //BATloop(inBAT, p, q) { //iterate over all valid elements
+ outs = (double*) Tloc(outBAT, 0);
+ #pragma omp parallel for
+ //BATloop(inBAT, p, q) { //iterate over all valid elements
+ for (p = 0; p < q; p++) {
str err = NULL;
+ //double outDbl = 0.0;
inMBR = (mbr *) BUNtail(inBAT_iter, p);
- if ((err = wkbCoordinateFromMBR(&outDbl, &inMBR,
coordinateIdx)) != MAL_SUCCEED) {
- BBPunfix(inBAT->batCacheid);
- BBPunfix(outBAT->batCacheid);
- return err;
+ //if ((err = wkbCoordinateFromMBR(&outDbl, &inMBR,
coordinateIdx)) != MAL_SUCCEED) {
+ if ((err = wkbCoordinateFromMBR(&outs[p], &inMBR,
coordinateIdx)) != MAL_SUCCEED) {
+ msg = err;
+ #pragma omp cancelregion
}
- BUNappend(outBAT, &outDbl, TRUE);
+ //BUNappend(outBAT, &outDbl, TRUE);
}
+#ifdef GEOMBULK_DEBUG
+ gettimeofday(&stop, NULL);
+ t = 1000 * (stop.tv_sec - start.tv_sec) + (stop.tv_usec - start.tv_usec) /
1000;
+ fprintf(stdout, "batgeom.coordinateFromMBR %llu ms\n", t);
+#endif
+
+ BBPunfix(inBAT->batCacheid);
+
+ if (msg != MAL_SUCCEED) {
+ BBPunfix(outBAT->batCacheid);
+ return msg;
+ }
//set some properties of the new BAT
BATsetcount(outBAT, BATcount(inBAT));
BATsettrivprop(outBAT);
- BATderiveProps(outBAT, FALSE);
- BBPunfix(inBAT->batCacheid);
+ //BATderiveProps(outBAT, FALSE);
BBPkeepref(*outBAT_id = outBAT->batCacheid);
+
return MAL_SUCCEED;
-
}
/**************************************************************************/
@@ -228,8 +303,11 @@ WKBtoDBL_bat(bat *outBAT_id, bat *inBAT_
BUN p = 0, q = 0;
BATiter inBAT_iter;
str msg = MAL_SUCCEED;
+#ifdef GEOMBULK_DEBUG
static struct timeval start, stop;
unsigned long long t;
+#endif
+ double *outs;
//get the descriptor of the BAT
if ((inBAT = BATdescriptor(*inBAT_id)) == NULL) {
@@ -245,38 +323,44 @@ WKBtoDBL_bat(bat *outBAT_id, bat *inBAT_
//iterator over the input BAT
inBAT_iter = bat_iterator(inBAT);
- omp_set_dynamic(0); // Explicitly disable dynamic teams
- omp_set_num_threads(1);
+ omp_set_dynamic(OPENCL_DYNAMIC); // Explicitly disable dynamic teams
+ omp_set_num_threads(OPENCL_THREADS);
q = BUNlast(inBAT);
- fprintf(stdout, "%d %d\n", p, q);
+#ifdef GEOMBULK_DEBUG
+ fprintf(stdout, "%s %d %d\n", name, p, q);
gettimeofday(&start, NULL);
+#endif
//BATloop(inBAT, p, q) { //iterate over all valid elements
+ outs = (double*) Tloc(outBAT, 0);
#pragma omp parallel for
for (p = 0; p < q; p++) {
str err = NULL;
wkb *inWKB = NULL;
- double outSingle;
+ //double outSingle;
inWKB = (wkb *) BUNtail(inBAT_iter, p);
- if ((err = (*func) (&outSingle, &inWKB)) != MAL_SUCCEED) {
+ //if ((err = (*func) (&outSingle, &inWKB)) != MAL_SUCCEED) {
+ if ((err = (*func) (&outs[p], &inWKB)) != MAL_SUCCEED) {
msg = err;
#pragma omp cancelregion
}
- BUNappend(outBAT, &outSingle, TRUE); //add the result to the
new BAT
+ //BUNappend(outBAT, &outSingle, TRUE); //add the result to the
new BAT
}
+#ifdef GEOMBULK_DEBUG
gettimeofday(&stop, NULL);
t = 1000 * (stop.tv_sec - start.tv_sec) + (stop.tv_usec - start.tv_usec) /
1000;
- fprintf(stdout, "%llu ms\n", t);
+ fprintf(stdout, "%s %llu ms\n", name, t);
+#endif
+
+ BBPunfix(inBAT->batCacheid);
if (msg != MAL_SUCCEED) {
- BBPunfix(inBAT->batCacheid);
BBPunfix(outBAT->batCacheid);
return msg;
}
- //set the number of elements in the outBAT
+
BATsetcount(outBAT, BATcount(inBAT));
-
- BBPunfix(inBAT->batCacheid);
+ BATderiveProps(outBAT, FALSE);
BBPkeepref(*outBAT_id = outBAT->batCacheid);
return MAL_SUCCEED;
@@ -300,6 +384,12 @@ WKBtoWKB_bat(bat *outBAT_id, bat *inBAT_
wkb *inWKB = NULL;
BUN p = 0, q = 0;
BATiter inBAT_iter;
+ wkb **outs = NULL;
+ str msg = MAL_SUCCEED;
+#ifdef GEOMBULK_DEBUG
+ static struct timeval start, stop;
+ unsigned long long t;
+#endif
//get the descriptor of the BAT
if ((inBAT = BATdescriptor(*inBAT_id)) == NULL) {
@@ -314,25 +404,64 @@ WKBtoWKB_bat(bat *outBAT_id, bat *inBAT_
//iterator over the input BAT
inBAT_iter = bat_iterator(inBAT);
- BATloop(inBAT, p, q) { //iterate over all valid elements
+
+ omp_set_dynamic(OPENCL_DYNAMIC); // Explicitly disable dynamic teams
+ omp_set_num_threads(OPENCL_THREADS);
+ q = BUNlast(inBAT);
+#ifdef GEOMBULK_DEBUG
+ fprintf(stdout, "%s %d %d\n", name, p, q);
+ gettimeofday(&start, NULL);
+#endif
+ outs = (wkb**) GDKmalloc(sizeof(wkb*) * BATcount(inBAT));
+ //BATloop(inBAT, p, q) { //iterate over all valid elements
+ #pragma omp parallel for
+ for (p = 0; p < q; p++) {
str err = NULL;
wkb *outSingle;
inWKB = (wkb *) BUNtail(inBAT_iter, p);
if ((err = (*func) (&outSingle, &inWKB)) != MAL_SUCCEED) {
- BBPunfix(inBAT->batCacheid);
- BBPunfix(outBAT->batCacheid);
- return err;
+ msg = err;
+ #pragma omp cancelregion
}
- BUNappend(outBAT, outSingle, TRUE); //add the result to the
new BAT
- GDKfree(outSingle);
- outSingle = NULL;
+ outs[p] = outSingle;
+ //BUNappend(outBAT, outSingle, TRUE); //add the result to the
new BAT
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list