diff options
author | xantares | 2015-06-08 21:50:47 +0200 |
---|---|---|
committer | xantares | 2015-06-08 21:50:47 +0200 |
commit | 8c4683eead7eec13681d3126dee00499b20d446b (patch) | |
tree | d6386554e67a948ee1d7f3006c17398e1a564e0a /parallel.patch | |
download | aur-8c4683eead7eec13681d3126dee00499b20d446b.tar.gz |
Initial import
Diffstat (limited to 'parallel.patch')
-rw-r--r-- | parallel.patch | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/parallel.patch b/parallel.patch new file mode 100644 index 000000000000..1d5e3ebb4ca4 --- /dev/null +++ b/parallel.patch @@ -0,0 +1,156 @@ +# HG changeset patch +# User Dmitriy Morozov <dmitriy@mrzv.org> +# Date 1247864070 25200 +# Node ID f1e962ffa1c22e979d80ab282aa26ab07d263390 +# Parent 689462154b3a1e285a559ed5747063498660f1df +ANNkd_tree:annkSearch() is reentrant, in particular it works with OpenMP + +diff -r 689462154b3a -r f1e962ffa1c2 src/bd_search.cpp +--- a/src/bd_search.cpp Tue Jul 14 09:25:24 2009 -0700 ++++ b/src/bd_search.cpp Fri Jul 17 13:54:30 2009 -0700 +@@ -36,6 +36,8 @@ + // bd_shrink::ann_search - search a shrinking node + //---------------------------------------------------------------------- + ++ANNpoint ANNkdQ; // query point ++ANNmin_k *ANNkdPointMK; // set of k closest points + void ANNbd_shrink::ann_search(ANNdist box_dist) + { + // check dist calc term cond. +diff -r 689462154b3a -r f1e962ffa1c2 src/kd_search.cpp +--- a/src/kd_search.cpp Tue Jul 14 09:25:24 2009 -0700 ++++ b/src/kd_search.cpp Fri Jul 17 13:54:30 2009 -0700 +@@ -77,10 +77,8 @@ + //---------------------------------------------------------------------- + + int ANNkdDim; // dimension of space +-ANNpoint ANNkdQ; // query point + double ANNkdMaxErr; // max tolerable squared error + ANNpointArray ANNkdPts; // the points +-ANNmin_k *ANNkdPointMK; // set of k closest points + + //---------------------------------------------------------------------- + // annkSearch - search for the k nearest neighbors +@@ -93,6 +91,8 @@ + ANNdistArray dd, // the approximate nearest neighbor + double eps) // the error bound + { ++ ANNpoint ANNkdQ; // query point ++ ANNmin_k *ANNkdPointMK; // set of k closest points + + ANNkdDim = dim; // copy arguments to static equivs + ANNkdQ = q; +@@ -108,7 +108,7 @@ + + ANNkdPointMK = new ANNmin_k(k); // create set for closest k points + // search starting at the root +- root->ann_search(annBoxDistance(q, bnd_box_lo, bnd_box_hi, dim)); ++ root->ann_search(ANNkdQ, ANNkdPointMK, annBoxDistance(q, bnd_box_lo, bnd_box_hi, dim)); + + for (int i = 0; i < k; i++) { // extract the k-th closest points + dd[i] = ANNkdPointMK->ith_smallest_key(i); +@@ -121,7 +121,7 @@ + // kd_split::ann_search - search a splitting node + //---------------------------------------------------------------------- + +-void ANNkd_split::ann_search(ANNdist box_dist) ++void ANNkd_split::ann_search(ANNpoint& ANNkdQ, ANNmin_k* ANNkdPointMK, ANNdist box_dist) + { + // check dist calc term condition + if (ANNmaxPtsVisited != 0 && ANNptsVisited > ANNmaxPtsVisited) return; +@@ -130,7 +130,7 @@ + ANNcoord cut_diff = ANNkdQ[cut_dim] - cut_val; + + if (cut_diff < 0) { // left of cutting plane +- child[ANN_LO]->ann_search(box_dist);// visit closer child first ++ child[ANN_LO]->ann_search(ANNkdQ, ANNkdPointMK, box_dist);// visit closer child first + + ANNcoord box_diff = cd_bnds[ANN_LO] - ANNkdQ[cut_dim]; + if (box_diff < 0) // within bounds - ignore +@@ -141,11 +141,11 @@ + + // visit further child if close enough + if (box_dist * ANNkdMaxErr < ANNkdPointMK->max_key()) +- child[ANN_HI]->ann_search(box_dist); ++ child[ANN_HI]->ann_search(ANNkdQ, ANNkdPointMK, box_dist); + + } + else { // right of cutting plane +- child[ANN_HI]->ann_search(box_dist);// visit closer child first ++ child[ANN_HI]->ann_search(ANNkdQ, ANNkdPointMK, box_dist);// visit closer child first + + ANNcoord box_diff = ANNkdQ[cut_dim] - cd_bnds[ANN_HI]; + if (box_diff < 0) // within bounds - ignore +@@ -156,7 +156,7 @@ + + // visit further child if close enough + if (box_dist * ANNkdMaxErr < ANNkdPointMK->max_key()) +- child[ANN_LO]->ann_search(box_dist); ++ child[ANN_LO]->ann_search(ANNkdQ, ANNkdPointMK, box_dist); + + } + ANN_FLOP(10) // increment floating ops +@@ -169,7 +169,7 @@ + // some fine tuning to replace indexing by pointer operations. + //---------------------------------------------------------------------- + +-void ANNkd_leaf::ann_search(ANNdist box_dist) ++void ANNkd_leaf::ann_search(ANNpoint& ANNkdQ, ANNmin_k* ANNkdPointMK, ANNdist box_dist) + { + register ANNdist dist; // distance to data point + register ANNcoord* pp; // data coordinate pointer +diff -r 689462154b3a -r f1e962ffa1c2 src/kd_search.h +--- a/src/kd_search.h Tue Jul 14 09:25:24 2009 -0700 ++++ b/src/kd_search.h Fri Jul 17 13:54:30 2009 -0700 +@@ -39,10 +39,10 @@ + //---------------------------------------------------------------------- + + extern int ANNkdDim; // dimension of space (static copy) +-extern ANNpoint ANNkdQ; // query point (static copy) ++// extern ANNpoint ANNkdQ; // query point (static copy) + extern double ANNkdMaxErr; // max tolerable squared error + extern ANNpointArray ANNkdPts; // the points (static copy) +-extern ANNmin_k *ANNkdPointMK; // set of k closest points ++// extern ANNmin_k *ANNkdPointMK; // set of k closest points + extern int ANNptsVisited; // number of points visited + + #endif +diff -r 689462154b3a -r f1e962ffa1c2 src/kd_tree.h +--- a/src/kd_tree.h Tue Jul 14 09:25:24 2009 -0700 ++++ b/src/kd_tree.h Fri Jul 17 13:54:30 2009 -0700 +@@ -28,6 +28,7 @@ + #define ANN_kd_tree_H + + #include <ANN/ANNx.h> // all ANN includes ++#include "pr_queue_k.h" // k-element priority queue + + using namespace std; // make std:: available + +@@ -47,7 +48,8 @@ + public: + virtual ~ANNkd_node() {} // virtual distroyer + +- virtual void ann_search(ANNdist) = 0; // tree search ++ virtual void ann_search(ANNdist) {} // tree search ++ virtual void ann_search(ANNpoint& ANNkdQ, ANNmin_k* ANNkdPointMK, ANNdist) {} // tree search + virtual void ann_pri_search(ANNdist) = 0; // priority search + virtual void ann_FR_search(ANNdist) = 0; // fixed-radius search + +@@ -110,7 +112,7 @@ + virtual void print(int level, ostream &out);// print node + virtual void dump(ostream &out); // dump node + +- virtual void ann_search(ANNdist); // standard search ++ virtual void ann_search(ANNpoint& ANNkdQ, ANNmin_k* ANNkdPointMK, ANNdist); // standard search + virtual void ann_pri_search(ANNdist); // priority search + virtual void ann_FR_search(ANNdist); // fixed-radius search + }; +@@ -176,7 +178,7 @@ + virtual void print(int level, ostream &out);// print node + virtual void dump(ostream &out); // dump node + +- virtual void ann_search(ANNdist); // standard search ++ virtual void ann_search(ANNpoint& ANNkdQ, ANNmin_k* ANNkdPointMK, ANNdist); // standard search + virtual void ann_pri_search(ANNdist); // priority search + virtual void ann_FR_search(ANNdist); // fixed-radius search + }; |