]> rtime.felk.cvut.cz Git - hubacji1/iamcar.git/commitdiff
Fix parallel nearest neighbour search
authorJiri Hubacek <hubacji1@fel.cvut.cz>
Sat, 1 Sep 2018 11:24:11 +0000 (13:24 +0200)
committerJiri Hubacek <hubacji1@fel.cvut.cz>
Sat, 1 Sep 2018 11:24:12 +0000 (13:24 +0200)
User-defined reduction needed for proper functionality.

base/nn.cc
incl/nn.h

index fcb5113cfd8a7fedda4ec78c04867323e791c8b8..ac1a3926210470632e41f5ae92c97e3037796006 100644 (file)
@@ -60,6 +60,7 @@ RRTNode *nn2(
         RRTNode *nn = nodes[0];
         float mcost = (*cost)(nn, node);
         unsigned int i;
+        // TODO fix see, user-defined reductions
         #pragma omp parallel for
         for (i = 0; i < nodes.size(); i++) {
                 if ((*cost)(nodes[i], node) < mcost) {
@@ -76,35 +77,36 @@ RRTNode *nn3(
                 float (*cost)(RRTNode *, RRTNode *))
 {
         int iy = floor(node->y() / IYSTEP) + floor(IYSIZE / 2);
-        RRTNode *nn = nullptr;
-        float mc = 9999;
+        struct mcnn nn;
+        nn.nn = nullptr;
+        nn.mc = 9999;
         unsigned int i = 0; // vector step
         unsigned int j = 0; // array step
         int iyj = 0;
-        while (mc > j * IYSTEP) {
+        while (nn.mc > j * IYSTEP) {
                 iyj = (int) (iy + j);
                 if (iyj >= IYSIZE)
                         iyj = IYSIZE - 1;
-                #pragma omp parallel for
+                #pragma omp parallel for reduction(minn: nn)
                 for (i = 0; i < nodes[iyj].size(); i++) {
-                        if ((*cost)(nodes[iyj][i], node) < mc) {
-                                mc = (*cost)(nodes[iyj][i], node);
-                                nn = nodes[iyj][i];
+                        if ((*cost)(nodes[iyj][i], node) < nn.mc) {
+                                nn.mc = (*cost)(nodes[iyj][i], node);
+                                nn.nn = nodes[iyj][i];
                         }
                 }
                 if (j > 0) {
                         iyj = (int) (iy - j);
                         if (iyj < 0)
                                 iyj = 0;
-                        #pragma omp parallel for
+                        #pragma omp parallel for reduction(minn: nn)
                         for (i = 0; i < nodes[iyj].size(); i++) {
-                                if ((*cost)(nodes[iyj][i], node) < mc) {
-                                        mc = (*cost)(nodes[iyj][i], node);
-                                        nn = nodes[iyj][i];
+                                if ((*cost)(nodes[iyj][i], node) < nn.mc) {
+                                        nn.mc = (*cost)(nodes[iyj][i], node);
+                                        nn.nn = nodes[iyj][i];
                                 }
                         }
                 }
                 j++;
         }
-        return nn;
+        return nn.nn;
 }
index 54e84d7fd9b8df53080a84ef4b03c12727873c2f..eaf4447e5e52326a21a78e276c4b0fd630b1144a 100644 (file)
--- a/incl/nn.h
+++ b/incl/nn.h
@@ -21,6 +21,16 @@ along with I am car. If not, see <http://www.gnu.org/licenses/>.
 #include "rrtbase.h"
 #include "rrtnode.h"
 
+struct mcnn { // min-cost nearest neighbour
+        float mc;
+        RRTNode *nn;
+};
+#pragma omp declare reduction \
+        (minn: struct mcnn: omp_out = \
+         omp_in.mc < omp_out.mc ? omp_in : omp_out) \
+         initializer \
+         (omp_priv(omp_orig))
+
 RRTNode *nn1(
                 std::vector<RRTNode *> &nodes,
                 RRTNode *node,