The diff is attached. The line numbers do not correspond to current gitHub 
version, changes in fact would apply in this version to l. 178

As for the pdf : Yes, comparing (between the 2 pages of the pdf..) case j4 of 
NewCode to case j1 of NewCode suggests a speedup of 1.15 - 1.2 (depending on 
whether "fusion operations" are executed or not)

But, it seems speed measurements significantly fluctuate. This is the only 
reason I see to explain the slight speedup obtained observed in j1 between Old 
and NewCode : p.1 of the pdf. I do not have a high experience of speed 
execution variability, but this variability I observe (between comparable 
simulations) makes me wonder if "1.15 - 1.2" speedup is beyond natural 
variability..

Jerome


________________________________
From: Yade-dev [[email protected]] 
on behalf of Bruno Chareyre [[email protected]]
Sent: March-12-15 2:40 AM
To: [email protected]
Subject: Re: [Yade-dev] Little news about capillary law2 in parallel

Hi Jérôme,
Thanks for update. Not sure I understand the pdf. Why is the new code faster 
than the old code with -j1?
Taking the difference between -j1 and -j4 with the new code suggests that the 
speedup of the capillary law is about x1.15, correct?
Before commiting, could you show the diff?
Thanks
Bruno

On 11/03/15 18:28, Jerome Duriez wrote:
Hi guys,

I finally reconsidered parallelization of 
Law2_ScGeom_CapillaryPhys_Capillarity, after our passed discussion (*).

I noticed only after re-starting this work that implementations of e.g. 
remove() and resize() in in-house class OpenMPVector would be necessary to do 
it completely right (using OpenMPVector objects in BodiesMenisciiList class). 
Then, I only coded yet parallel loops for the "addForce" block, at the end of 
the Law2....

Obviously, the results (in terms of capillary stresses as given by 
getCapillaryStress() function) are unaffected by the changes : see the four 
attached pictures, showing sXXcap or sYYcap for two triaxial loadings with 
20000 particles, repeted before and after changing code. One loading is with 10 
kPa capillary pressure : meniscii fusion occur in the sample, affecting the 
simulation (with fusionDetection = 1,binaryFusion=0 attributes of the Law2). 
For the other one, the suction value of 300 kPa prevents any meniscii fusion.

As for the speed up, *maybe* such changes in the code allow a significant speed 
up (of capillary Law2) to be obtained with parallel computations... See the 
data sheet "NBl2cp" (in ods or pdf format).
Anyway, I hope it is clear this little change in code does not harm. Since it 
might still be little useful, and exists already on my computer, I plann to 
commit it, after time for discussion.

Jerome

PS : these results might still be of interest for you if you are curious of 
results scattering through parallel computations, or capillary law2 and 
NewtonIntegrator (NI) timings... I obtain here e.g. a speed up of NI about 2.3 
from j1 to j4


(*) https://www.mail-archive.com/[email protected]/msg10842.html)



_______________________________________________
Mailing list: https://launchpad.net/~yade-dev
Post to     : [email protected]<mailto:[email protected]>
Unsubscribe : https://launchpad.net/~yade-dev
More help   : https://help.launchpad.net/ListHelp




--
_______________
Bruno Chareyre
Associate Professor
ENSE³ - Grenoble INP
Lab. 3SR
BP 53
38041 Grenoble cedex 9
Tél : +33 4 56 52 86 21
Fax : +33 4 76 82 70 43
________________

diff --git a/pkg/dem/Law2_ScGeom_CapillaryPhys_Capillarity.cpp b/pkg/dem/Law2_ScGeom_CapillaryPhys_Capillarity.cpp
index b510c0a..0545f31 100644
--- a/pkg/dem/Law2_ScGeom_CapillaryPhys_Capillarity.cpp
+++ b/pkg/dem/Law2_ScGeom_CapillaryPhys_Capillarity.cpp
@@ -164,7 +164,14 @@ void Law2_ScGeom_CapillaryPhys_Capillarity::action()
 	}
 	if (fusionDetection) checkFusion();
 
-	FOREACH(const shared_ptr<Interaction>& interaction, *scene->interactions){ // same remark for parallel loops
+        #ifdef YADE_OPENMP
+        const long size=scene->interactions->size();
+        #pragma omp parallel for schedule(guided) num_threads(ompThreads>0 ? min(ompThreads,omp_get_max_threads()) : omp_get_max_threads())
+        for(long i=0; i<size; i++){
+            const shared_ptr<Interaction>& interaction=(*scene->interactions)[i];
+        #else
+        FOREACH(const shared_ptr<Interaction>& interaction, *scene->interactions){
+        #endif
 		if (interaction->isReal()) {
 			CapillaryPhys* cundallContactPhysics=NULL;
 			MindlinCapillaryPhys* mindlinContactPhysics=NULL;
_______________________________________________
Mailing list: https://launchpad.net/~yade-dev
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~yade-dev
More help   : https://help.launchpad.net/ListHelp

Reply via email to