int benchNoCachingNoVector(Vector3D<Precision> const &point, Vector3D<Precision> const &dir, std::vector<Vector3D<Precision>> const &corners #ifdef SORTHITBOXES , Container_t &hitlist #endif ) { #ifdef INNERTIMER Stopwatch timer; timer.Start(); #endif int vecsize = corners.size() / 2; int hitcount = 0; for (auto box = 0; box < vecsize; ++box) { double distance = BoxImplementation<translation::kIdentity, rotation::kIdentity>::Intersect( &corners[2 * box], point, dir, 0, vecgeom::kInfLength); if (distance < vecgeom::kInfLength) { hitcount++; #ifdef SORTHITBOXES hitlist.push_back(BoxIdDistancePair_t(box, distance)); #endif } } #ifdef INNERTIMER timer.Stop(); std::cerr << "# ORDINARY hitting " << hitcount << "\n"; std::cerr << "# ORDINARY timer " << timer.Elapsed() << "\n"; #endif return hitcount; }
int main() { Container_t container; auto & sequenced = container.get<0>(); fillFront(sequenced); stabled_ordered(container, [](Entry const& entry) { cout << entry.nonUniqueInt << ": " << entry.somethingExtra << endl; }); cout << endl; container.clear(); fillBack(sequenced); stabled_ordered(container, [](Entry const& entry) { cout << entry.nonUniqueInt << ": " << entry.somethingExtra << endl; }); }
void TestFind(Container_t<T>& _obj) { if(_obj.Count() == 0) { cout<<"no items"<<endl; return; } cout<<"please choose an index(0-"<<(_obj.Count()-1)<<")"<<endl; int index; cin>>index; try { T item = _obj.Find(index); cout<<"found item is "<< item <<endl; } catch(TException_t<int>& err) { cout<<err.GetDesCription(); } }
template<typename T> void TestInsert(Container_t<T>& _obj) { cout<<"please insert an item (int): "<<endl; int item; cin>>item; try { _obj.Insert(item); } catch(TException_t<int>& err) { cout<<err.GetDesCription(); } }
void TestPrint(Container_t<T>& _obj) { _obj.Print(); }
void TestCount(Container_t<T>& _obj) { cout<<"num of items is: "<<_obj.Count()<<endl; }
void TestRemoveAll(Container_t<T>& _obj) { _obj.RemoveAll(); cout<<"all items was removed"<<endl; }
int main() { bool cont = true; // trigger to stop loop unsigned int c; bool isArray; int element; int* newElement; int position; Container_t<int>* container; cout << "Choose container type:" << endl << " 1: Array_t<int>" << endl << " 2: Dlist_t<int>" << endl; cin >> c; switch (c) { case 1: container = new Array_t<int>(); isArray = true; break; case 2: container = new Dlist_t<int>(); isArray = false; break; default: cerr << "Unexpected input " << c << endl; return 1; } while (cont) { cout << " 0: count" << endl << " 1: find" << endl << " 2: insert" << endl << " 3: append" << endl << " 4: prepend" << endl << " 5: remove" << endl << " 6: removeAndDelete" << endl << " 7: removeAll" << endl << " 8: removeAndDeleteAll" << endl << " 9: type-specific" << endl << "Enter your choice: "; cin >> c; switch (c) { case 0: cout << "Container contains " << container->count() << " elements" << endl; break; case 1: cout << "Enter element to find: " << endl; cin >> element; cout << "Element " << element << " is " << (container->find(element) != NULL ? "found" : "not found") << " in container" << endl; break; case 2: newElement = new int(); cout << "Enter element to insert: " << endl; cin >> (*newElement); container->insert(*newElement); cout << "Inserted element " << (*newElement) << endl; break; case 3: newElement = new int(); cout << "Enter element to insert: " << endl; cin >> (*newElement); cout << "Enter position to append: " << endl; cin >> position; container->append(*newElement, position); cout << "Appended element " << (*newElement) << " after position " << position << endl; break; case 4: newElement = new int(); cout << "Enter element to insert: " << endl; cin >> (*newElement); cout << "Enter position to preppend: " << endl; cin >> position; container->prepend(*newElement, position); cout << "Preppended element " << (*newElement) << "before position " << position << endl; break; case 5: cout << "Enter element to remove: " << endl; cin >> element; cout << "Element " << element << (container->remove(element) != NULL ? " was removed" : " was not found") << endl; break; case 6: cout << "Enter element to remove and delete: " << endl; cin >> element; container->removeAndDelete(element); cout << "Element " << element << " was removed and deleted" << endl; break; case 7: container->removeAll(); cout << "All elements on container were removed" << endl; break; case 8: container->removeAndDeleteAll(); cout << "All elements on container were removed and deleted" << endl; break; case 9: if (isArray) { cout << "Retrieve at subscript: "; cin >> c; cout << (*(Array_t<int>*)container)[c] << endl; } else { cout << " 0: reset" << endl << " 1: next" << endl << " 2: prev" << endl << "Enter your choice: "; cin >> c; switch (c) { int* element; case 0: element = ((Dlist_t<int>*)container)->reset(); break; case 1: element = ((Dlist_t<int>*)container)->next(); break; case 2: element = ((Dlist_t<int>*)container)->prev(); break; default: cont = false; break; if (cont) { if (element != NULL) { cout << "Cursor at " << *element << endl; } else { cout << "Cursor out of bounds" << endl; } } } } break; default: cont = false; break; } }
int benchCachingAndVector(Vector3D<Precision> const &point, Vector3D<Precision> const &dir, Vector3D<kVc::precision_v> const *corners, int vecsize #ifdef SORTHITBOXES , Container_t &hitlist #endif ) { #ifdef INNERTIMER Stopwatch timer; timer.Start(); #endif Vector3D<Precision> invdir(1. / dir.x(), 1. / dir.y(), 1. / dir.z()); int hitcount = 0; int sign[3]; sign[0] = invdir.x() < 0; sign[1] = invdir.y() < 0; sign[2] = invdir.z() < 0; for (auto box = 0; box < vecsize; ++box) { kVc::precision_v distance = BoxImplementation<translation::kIdentity, rotation::kIdentity>::IntersectCachedKernel2<kVc>( &corners[2 * box], point, invdir, sign[0], sign[1], sign[2], 0, vecgeom::kInfLength); kVc::bool_v hit = distance < vecgeom::kInfLength; // std::cerr << hit << "\n"; // this is Vc specific hitcount += hit.count(); #ifdef SORTHITBOXES // a little tricky: need to iterate over the mask for (auto i = 0; i < kVc::precision_v::Size; ++i) { if (hit[i]) // which box id?? hitlist.push_back(BoxIdDistancePair_t(box * kVc::precision_v::Size + i, distance[i])); } #endif } // interpret as binary number and do a switch statement // do a big switch statement here // switch( size[0] + size[1] + size[2] ){ // case 0: { // for( auto box = 0; box < vecsize; ++box ){ // kVc::precision_v distance = BoxImplementation<translation::kIdentity, // rotation::kIdentity>::IntersectCachedKernel<kVc,0,0,0>( // &corners[2*box], // point, // invdir, // 0, vecgeom::kInfLength ); // kVc::bool_v hit = distance < vecgeom::kInfLength; // //std::cerr << hit << "\n"; // hitcount += hit.count(); // } break; } // case 3: { // for( auto box = 0; box < vecsize; ++box ){ // kVc::precision_v distance = BoxImplementation<translation::kIdentity, // rotation::kIdentity>::IntersectCachedKernel<kVc,1,1,1>( // &corners[2*box], // point, // invdir, // 0, vecgeom::kInfLength ); // kVc::bool_v hit = distance < vecgeom::kInfLength; // //std::cerr << hit << "\n"; // hitcount += hit.count(); // } break; } // default : std::cerr << "DEFAULT CALLED\n"; // } #ifdef INNERTIMER timer.Stop(); std::cerr << "# VECTOR hitting " << hitcount << "\n"; std::cerr << "# VECTOR timer " << timer.Elapsed() << "\n"; #endif return hitcount; }
int benchCachingNoVector(Vector3D<Precision> const &point, Vector3D<Precision> const &dir, std::vector<Vector3D<Precision>> const &corners #ifdef SORTHITBOXES , Container_t &hitlist #endif ) { #ifdef INNERTIMER Stopwatch timer; timer.Start(); #endif Vector3D<Precision> invdir(1. / dir.x(), 1. / dir.y(), 1. / dir.z()); int vecsize = corners.size() / 2; int hitcount = 0; int sign[3]; sign[0] = invdir.x() < 0; sign[1] = invdir.y() < 0; sign[2] = invdir.z() < 0; // interpret as binary number and do a switch statement // do a big switch statement here // int code = 2 << size[0] + 2 << size[1] + 2 << size[2]; for (auto box = 0; box < vecsize; ++box) { double distance = BoxImplementation<translation::kIdentity, rotation::kIdentity>::IntersectCachedKernel2<kScalar>( &corners[2 * box], point, invdir, sign[0], sign[1], sign[2], 0, vecgeom::kInfLength); if (distance < vecgeom::kInfLength) { hitcount++; #ifdef SORTHITBOXES hitlist.push_back(BoxIdDistancePair_t(box, distance)); #endif } } // switch( size[0] + size[1] + size[2] ){ // case 0: { // for( auto box = 0; box < vecsize; ++box ){ // double distance = BoxImplementation<translation::kIdentity, // rotation::kIdentity>::IntersectCachedKernel<kScalar,0,0,0>( // &corners[2*box], // point, // invdir, // 0, vecgeom::kInfLength ); // if( distance < vecgeom::kInfLength ) hitcount++; // } break; } // case 3: { // for( auto box = 0; box < vecsize; ++box ){ // double distance = BoxImplementation<translation::kIdentity, // rotation::kIdentity>::IntersectCachedKernel<kScalar,1,1,1>( // &corners[2*box], // point, // invdir, // 0, vecgeom::kInfLength ); // if( distance < vecgeom::kInfLength ) hitcount++; // } break; } // default : std::cerr << "DEFAULT CALLED\n"; // } #ifdef INNERTIMER timer.Stop(); std::cerr << "# CACHED hitting " << hitcount << "\n"; std::cerr << "# CACHED timer " << timer.Elapsed() << "\n"; #endif return hitcount; }
int main() { // number of boxes int numberofboxes = N * N * N; int code = (2 << 1) + (2 << 0) + (2 << 1); std::cerr << code << "\n"; // setup AOS form of boxes std::vector<Vector3D<Precision>> uppercorners(numberofboxes); std::vector<Vector3D<Precision>> lowercorners(numberofboxes); // setup same in mixed array of corners ... upper-lower-upper-lower ... std::vector<Vector3D<Precision>> corners(2 * numberofboxes); // setup SOA form of boxes -- the memory layout should probably rather be SOA6D Vector3D<kVc::precision_v> *VcCorners = new Vector3D<kVc::precision_v>[ 2 * numberofboxes / kVc::precision_v::Size ]; int counter1 = 0; int counter2 = 0; for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { for (int k = 0; k < N; ++k) { lowercorners[counter1] = Vector3D<Precision>(i, j, k); uppercorners[counter1] = Vector3D<Precision>(i + delta, j + delta, k + delta); corners[counter2] = lowercorners[counter1]; counter2++; corners[counter2] = uppercorners[counter1]; counter2++; counter1++; } } } // print boxes for (int i = 0; i < numberofboxes; ++i) { // std::cerr << "# " << i << " lower " << lowercorners[i] << " " << uppercorners[i] << "\n"; } // set up VcCorners counter2 = 0; for (int i = 0; i < numberofboxes; i += kVc::precision_v::Size) { Vector3D<kVc::precision_v> lower; Vector3D<kVc::precision_v> upper; // assign by components for (int k = 0; k < kVc::precision_v::Size; ++k) { lower.x()[k] = lowercorners[i + k].x(); lower.y()[k] = lowercorners[i + k].y(); lower.z()[k] = lowercorners[i + k].z(); upper.x()[k] = uppercorners[i + k].x(); upper.y()[k] = uppercorners[i + k].y(); upper.z()[k] = uppercorners[i + k].z(); } // std::cerr << lower << "\n"; // std::cerr << upper << "\n"; VcCorners[counter2++] = lower; VcCorners[counter2++] = upper; } std::cerr << "assigned " << counter2 << "Vc vectors\n"; // constructing samples std::vector<Vector3D<Precision>> points(SZ); std::vector<Vector3D<Precision>> directions(SZ); for (int i = 0; i < SZ; ++i) { points[i] = Vector3D<Precision>(N * delta + 0.1, N * delta + 0.1, N * delta + 0.1); directions[i] = volumeUtilities::SampleDirection(); } Container_t hitlist; hitlist.resize(2 * N); Stopwatch timer; int hits = 0; double meanfurthestdistance = 0; timer.Start(); for (int i = 0; i < SZ; ++i) { #ifdef SORTHITBOXES hitlist.clear(); #endif hits += benchCachingNoVector(points[i], directions[i], corners #ifdef SORTHITBOXES , hitlist #endif ); #ifdef SORTHITBOXES sort(hitlist, HitBoxComparatorFunctor()); meanfurthestdistance += hitlist.back().second; // std::cerr << hitlist << "\n"; #endif } timer.Stop(); std::cerr << "Cached times and hit " << timer.Elapsed() << " " << hits << " " << meanfurthestdistance << "\n"; hits = 0; meanfurthestdistance = 0.; timer.Start(); for (int i = 0; i < SZ; ++i) { hitlist.clear(); hits += benchNoCachingNoVector(points[i], directions[i], corners #ifdef SORTHITBOXES , hitlist #endif ); #ifdef SORTHITBOXES sort(hitlist, HitBoxComparatorFunctor()); meanfurthestdistance += hitlist.back().second; #endif } timer.Stop(); std::cerr << "Ordinary times and hit " << timer.Elapsed() << " " << hits << " " << meanfurthestdistance << "\n"; hits = 0; meanfurthestdistance = 0.; timer.Start(); for (int i = 0; i < SZ; ++i) { #ifdef SORTHITBOXES hitlist.clear(); #endif hits += benchCachingAndVector(points[i], directions[i], VcCorners, numberofboxes / kVc::precision_v::Size #ifdef SORTHITBOXES , hitlist #endif ); #ifdef SORTHITBOXES sort(hitlist, HitBoxComparatorFunctor()); meanfurthestdistance += hitlist.back().second; // std::cerr << "VECTORHITLIST" << hitlist << "\n"; #endif } timer.Stop(); std::cerr << "Vector times and hit " << timer.Elapsed() << " " << hits << " " << meanfurthestdistance << "\n"; return 0; }