4848#include < unordered_set>
4949
5050#include " db_sta/dbNetwork.hh"
51+ #include " kokkosUtil.h"
5152#include " placerObjects.h"
5253#include " sta/Liberty.hh"
5354#include " utl/Logger.h"
@@ -58,13 +59,6 @@ using utl::GPL2;
5859
5960#define REPLACE_SQRT2 1 .414213562373095048801L
6061
61- #ifdef KOKKOS_ENABLE_CUDA
62- #define BACKEND_DEPENDENT_FUNCTION __host__
63- #else
64- #define BACKEND_DEPENDENT_FUNCTION KOKKOS_FUNCTION
65- #endif
66-
67-
6862// /////////////////////////////////////////////////////////////////////////////////
6963// PlacerBaseVars
7064// /////////////////////////////////////////////////////////////////////////////////
@@ -844,17 +838,14 @@ void PlacerBase::initDensity1()
844838
845839// (a) // (a) define the get distance method
846840// getDistance is only defined on the host side
847- BACKEND_DEPENDENT_FUNCTION float getDistance (const Kokkos::View<const FloatPoint*>& a,
841+ HOST_FUNCTION float getDistance (const Kokkos::View<const FloatPoint*>& a,
848842 const Kokkos::View<const FloatPoint*>& b,
849843 const int numInsts)
850844{
851845 if (numInsts <= 0 ) {
852846 return 0.0 ;
853847 }
854848
855- float sumDistance = 0.0 ;
856- Kokkos::DefaultHostExecutionSpace hostSpace;
857-
858849 auto aPlusbDistance = Kokkos::View<float *, Kokkos::DefaultExecutionSpace>(" aPlusbDistance" , numInsts);
859850 Kokkos::parallel_for (numInsts, KOKKOS_LAMBDA (const int i) {
860851 const FloatPoint& aPoint = a[i];
@@ -864,11 +855,7 @@ BACKEND_DEPENDENT_FUNCTION float getDistance(const Kokkos::View<const FloatPoint
864855 aPlusbDistance[i] = aDistance + bDistance;
865856 });
866857
867- auto haPlusbDistance = Kokkos::create_mirror_view_and_copy (hostSpace, aPlusbDistance);
868- for (int i = 0 ; i<numInsts; ++i) {
869- sumDistance += haPlusbDistance[i];
870- }
871-
858+ float sumDistance = sumFloats (aPlusbDistance, numInsts);
872859 return std::sqrt (sumDistance / (2.0 * numInsts));
873860}
874861
@@ -881,19 +868,6 @@ struct myAbs
881868 }
882869};
883870
884- BACKEND_DEPENDENT_FUNCTION float getAbsGradSum (const Kokkos::View<const float *>& a, const int numInsts)
885- {
886- Kokkos::DefaultHostExecutionSpace hostSpace;
887- auto hA = Kokkos::create_mirror_view_and_copy (hostSpace, a);
888-
889- double sumAbs = 0.0 ;
890- for (int i = 0 ; i<numInsts; ++i) {
891- double x = hA[i];
892- sumAbs += x;
893- }
894- return sumAbs;
895- }
896-
897871float PlacerBase::getStepLength (const Kokkos::View<const FloatPoint*>& prevSLPCoordi,
898872 const Kokkos::View<const FloatPoint*>& prevSLPSumGrads,
899873 const Kokkos::View<const FloatPoint*>& curSLPCoordi,
@@ -1007,15 +981,14 @@ void PlacerBase::updateGradients(const Kokkos::View<float*>& wireLengthGradients
1007981 densityGradSum_ = 0 ;
1008982
1009983 // get the forces on each instance
1010- Kokkos::View<float *> wirelenabsGradXPlusY (" absGradXPlusY" , numInsts_);
1011- Kokkos::View<float *> densityabsGradXPlusY (" absGradXPlusY" , numInsts_);
1012- Kokkos::DefaultHostExecutionSpace hostSpace;
984+ Kokkos::View<float *> wireLengthGradAbsXPlusY (" wireLengthGradAbsXPlusY" , numInsts_);
985+ Kokkos::View<float *> densityGradAbsXPlusY (" densityGradAbsXPlusY" , numInsts_);
1013986
1014- getWireLengthGradientWA (wireLengthGradientsX, wireLengthGradientsY, wirelenabsGradXPlusY );
1015- getDensityGradient (densityGradientsX, densityGradientsY, densityabsGradXPlusY );
987+ getWireLengthGradientWA (wireLengthGradientsX, wireLengthGradientsY, wireLengthGradAbsXPlusY );
988+ getDensityGradient (densityGradientsX, densityGradientsY, densityGradAbsXPlusY );
1016989
1017- wireLengthGradSum_ += getAbsGradSum (wirelenabsGradXPlusY , numInsts_);
1018- densityGradSum_ += getAbsGradSum (densityabsGradXPlusY , numInsts_);
990+ wireLengthGradSum_ += sumFloatsAccurate (wireLengthGradAbsXPlusY , numInsts_);
991+ densityGradSum_ += sumFloatsAccurate (densityGradAbsXPlusY , numInsts_);
1019992
1020993 sumGradientKernel (numInsts_,
1021994 densityPenalty_,
0 commit comments