diff --git a/Src/GroupTree/Core/FGroupTaskDepAlgorithm.hpp b/Src/GroupTree/Core/FGroupTaskDepAlgorithm.hpp index 8dd9fff332fc26ff889fe2bb4d385a88f2c30577..834ba81cae524849b96b2162f72a2c393208fba2 100644 --- a/Src/GroupTree/Core/FGroupTaskDepAlgorithm.hpp +++ b/Src/GroupTree/Core/FGroupTaskDepAlgorithm.hpp @@ -19,7 +19,8 @@ #include <omp.h> -template <class OctreeClass, class CellContainerClass, class CellClass, class KernelClass, class ParticleGroupClass, class ParticleContainerClass> +template <class OctreeClass, class CellContainerClass, class CellClass, + class SymboleCellClass, class PoleCellClass, class LocalCellClass, class KernelClass, class ParticleGroupClass, class ParticleContainerClass> class FGroupTaskDepAlgorithm { protected: template <class OtherBlockClass> @@ -42,8 +43,14 @@ public: FAssertLF(inKernels, "kernels cannot be null"); kernels = new KernelClass*[MaxThreads]; + #pragma omp parallel for schedule(static) for(int idxThread = 0 ; idxThread < MaxThreads ; ++idxThread){ - this->kernels[idxThread] = new KernelClass(*inKernels); + // We want to ensure that each thread allocate data close to him + // and that only one thread at a time call the copy constructor + #pragma omp critical (FGroupTaskDepAlgorithm_InitKernels) + { + this->kernels[idxThread] = new KernelClass(*inKernels); + } } FLOG(FLog::Controller << "FGroupTaskDepAlgorithm (Max Thread " << MaxThreads << ")\n"); diff --git a/Tests/noDist/testBlockedAlgorithm.cpp b/Tests/noDist/testBlockedAlgorithm.cpp index 0754f4c1fa451f14b8910efc11f61f57f663e8c5..c5834e997148fb6baa2993c50e5827fd6b3715ec 100644 --- a/Tests/noDist/testBlockedAlgorithm.cpp +++ b/Tests/noDist/testBlockedAlgorithm.cpp @@ -68,7 +68,8 @@ int main(int argc, char* argv[]){ typedef FTestKernels< GroupCellClass, GroupContainerClass > GroupKernelClass; // Set the number of threads omp_set_num_threads(FParameters::getValue(argc,argv,FParameterDefinitions::NbThreads.options, omp_get_max_threads())); - typedef FGroupTaskDepAlgorithm<GroupOctreeClass, typename GroupOctreeClass::CellGroupClass, GroupCellClass, GroupKernelClass, typename GroupOctreeClass::ParticleGroupClass, GroupContainerClass > GroupAlgorithm; + typedef FGroupTaskDepAlgorithm<GroupOctreeClass, typename GroupOctreeClass::CellGroupClass, GroupCellClass, + GroupCellSymbClass, GroupCellUpClass, GroupCellDownClass, GroupKernelClass, typename GroupOctreeClass::ParticleGroupClass, GroupContainerClass > GroupAlgorithm; #else typedef FTestKernels< GroupCellClass, GroupContainerClass > GroupKernelClass; //typedef FGroupSeqAlgorithm<GroupOctreeClass, typename GroupOctreeClass::CellGroupClass, GroupCellClass, GroupKernelClass, typename GroupOctreeClass::ParticleGroupClass, GroupContainerClass > GroupAlgorithm; diff --git a/Tests/noDist/testBlockedChebyshev.cpp b/Tests/noDist/testBlockedChebyshev.cpp index 4fd808b7a22ef9f214ea268802680e27803b67dd..4caecfab8442b7f88c0860d7eef1dba9356f2604 100644 --- a/Tests/noDist/testBlockedChebyshev.cpp +++ b/Tests/noDist/testBlockedChebyshev.cpp @@ -77,7 +77,8 @@ int main(int argc, char* argv[]){ typedef FChebSymKernel<GroupCellClass,GroupContainerClass,MatrixKernelClass,ORDER> GroupKernelClass; // Set the number of threads omp_set_num_threads(FParameters::getValue(argc,argv,FParameterDefinitions::NbThreads.options, omp_get_max_threads())); - typedef FGroupTaskDepAlgorithm<GroupOctreeClass, typename GroupOctreeClass::CellGroupClass, GroupCellClass, GroupKernelClass, typename GroupOctreeClass::ParticleGroupClass, GroupContainerClass > GroupAlgorithm; + typedef FGroupTaskDepAlgorithm<GroupOctreeClass, typename GroupOctreeClass::CellGroupClass, GroupCellClass + GroupCellSymbClass, GroupCellUpClass, GroupCellDownClass,, GroupKernelClass, typename GroupOctreeClass::ParticleGroupClass, GroupContainerClass > GroupAlgorithm; #else typedef FChebSymKernel<GroupCellClass,GroupContainerClass,MatrixKernelClass,ORDER> GroupKernelClass; //typedef FGroupSeqAlgorithm<GroupOctreeClass, typename GroupOctreeClass::CellGroupClass, GroupCellClass, GroupKernelClass, typename GroupOctreeClass::ParticleGroupClass, GroupContainerClass > GroupAlgorithm; diff --git a/Tests/noDist/testBlockedRotation.cpp b/Tests/noDist/testBlockedRotation.cpp index f796f635bb12121edcf3df80c4ac2feb91baf771..3b7270f27d897e9ab12ea51cc67634ddd47f0970 100644 --- a/Tests/noDist/testBlockedRotation.cpp +++ b/Tests/noDist/testBlockedRotation.cpp @@ -63,7 +63,8 @@ int main(int argc, char* argv[]){ typedef FRotationKernel< GroupCellClass, GroupContainerClass , P> GroupKernelClass; // Set the number of threads omp_set_num_threads(FParameters::getValue(argc,argv,FParameterDefinitions::NbThreads.options, omp_get_max_threads())); - typedef FGroupTaskDepAlgorithm<GroupOctreeClass, typename GroupOctreeClass::CellGroupClass, GroupCellClass, GroupKernelClass, typename GroupOctreeClass::ParticleGroupClass, GroupContainerClass > GroupAlgorithm; + typedef FGroupTaskDepAlgorithm<GroupOctreeClass, typename GroupOctreeClass::CellGroupClass, GroupCellClass, + GroupCellSymbClass, GroupCellUpClass, GroupCellDownClass, GroupKernelClass, typename GroupOctreeClass::ParticleGroupClass, GroupContainerClass > GroupAlgorithm; #else typedef FRotationKernel< GroupCellClass, GroupContainerClass , P> GroupKernelClass; //typedef FGroupSeqAlgorithm<GroupOctreeClass, typename GroupOctreeClass::CellGroupClass, GroupCellClass, GroupKernelClass, typename GroupOctreeClass::ParticleGroupClass, GroupContainerClass > GroupAlgorithm; diff --git a/Tests/noDist/testBlockedTaylor.cpp b/Tests/noDist/testBlockedTaylor.cpp index 422ee3d6a1930991faf15912d05be9d3bad659d1..c56c528402b2f562e8a64e8fb6557f8c81b83ffc 100644 --- a/Tests/noDist/testBlockedTaylor.cpp +++ b/Tests/noDist/testBlockedTaylor.cpp @@ -63,7 +63,8 @@ int main(int argc, char* argv[]){ typedef FTaylorKernel< GroupCellClass, GroupContainerClass , P,1> GroupKernelClass; // Set the number of threads omp_set_num_threads(FParameters::getValue(argc,argv,FParameterDefinitions::NbThreads.options, omp_get_max_threads())); - typedef FGroupTaskDepAlgorithm<GroupOctreeClass, typename GroupOctreeClass::CellGroupClass, GroupCellClass, GroupKernelClass, typename GroupOctreeClass::ParticleGroupClass, GroupContainerClass > GroupAlgorithm; + typedef FGroupTaskDepAlgorithm<GroupOctreeClass, typename GroupOctreeClass::CellGroupClass, GroupCellClass, + GroupCellSymbClass, GroupCellUpClass, GroupCellDownClass, GroupKernelClass, typename GroupOctreeClass::ParticleGroupClass, GroupContainerClass > GroupAlgorithm; #else typedef FTaylorKernel< GroupCellClass, GroupContainerClass , P,1> GroupKernelClass; //typedef FGroupSeqAlgorithm<GroupOctreeClass, typename GroupOctreeClass::CellGroupClass, GroupCellClass, GroupKernelClass, typename GroupOctreeClass::ParticleGroupClass, GroupContainerClass > GroupAlgorithm; diff --git a/Tests/noDist/testBlockedTree.cpp b/Tests/noDist/testBlockedTree.cpp index 0c0f9966e20692b88f8cdd94f47c734d0e99ba16..cdd48c9d4e57f9b71bd41e5de3dc01a8c36e3edb 100644 --- a/Tests/noDist/testBlockedTree.cpp +++ b/Tests/noDist/testBlockedTree.cpp @@ -112,7 +112,8 @@ int main(int argc, char* argv[]){ typedef FRotationKernel< GroupCellClass, GroupContainerClass , P> GroupKernelClass; // Set the number of threads omp_set_num_threads(FParameters::getValue(argc,argv,FParameterDefinitions::NbThreads.options, omp_get_max_threads())); - typedef FGroupTaskDepAlgorithm<GroupOctreeClass, typename GroupOctreeClass::CellGroupClass, GroupCellClass, GroupKernelClass, typename GroupOctreeClass::ParticleGroupClass, GroupContainerClass > GroupAlgorithm; + typedef FGroupTaskDepAlgorithm<GroupOctreeClass, typename GroupOctreeClass::CellGroupClass, GroupCellClass, + GroupCellSymbClass, GroupCellUpClass, GroupCellDownClass, GroupKernelClass, typename GroupOctreeClass::ParticleGroupClass, GroupContainerClass > GroupAlgorithm; #else typedef FRotationKernel< GroupCellClass, GroupContainerClass , P> GroupKernelClass; //typedef FGroupSeqAlgorithm<GroupOctreeClass, typename GroupOctreeClass::CellGroupClass, GroupCellClass, GroupKernelClass, typename GroupOctreeClass::ParticleGroupClass, GroupContainerClass > GroupAlgorithm; diff --git a/Tests/noDist/testBlockedUniform.cpp b/Tests/noDist/testBlockedUniform.cpp index 351b3c43ceb348418c0ec4fccc596da69a97a69a..e8a08006ba9cfd632aa37381c3a00e2ad17ce37d 100644 --- a/Tests/noDist/testBlockedUniform.cpp +++ b/Tests/noDist/testBlockedUniform.cpp @@ -78,7 +78,8 @@ int main(int argc, char* argv[]){ typedef FUnifKernel<GroupCellClass,GroupContainerClass,MatrixKernelClass,ORDER> GroupKernelClass; // Set the number of threads omp_set_num_threads(FParameters::getValue(argc,argv,FParameterDefinitions::NbThreads.options, omp_get_max_threads())); - typedef FGroupTaskDepAlgorithm<GroupOctreeClass, typename GroupOctreeClass::CellGroupClass, GroupCellClass, GroupKernelClass, typename GroupOctreeClass::ParticleGroupClass, GroupContainerClass > GroupAlgorithm; + typedef FGroupTaskDepAlgorithm<GroupOctreeClass, typename GroupOctreeClass::CellGroupClass, GroupCellClass, + GroupCellSymbClass, GroupCellUpClass, GroupCellDownClass, GroupKernelClass, typename GroupOctreeClass::ParticleGroupClass, GroupContainerClass > GroupAlgorithm; #else typedef FUnifKernel<GroupCellClass,GroupContainerClass,MatrixKernelClass,ORDER> GroupKernelClass; //typedef FGroupSeqAlgorithm<GroupOctreeClass, typename GroupOctreeClass::CellGroupClass, GroupCellClass, GroupKernelClass, typename GroupOctreeClass::ParticleGroupClass, GroupContainerClass > GroupAlgorithm;