@@ -71,17 +71,56 @@ namespace grb {
7171 const grb::Vector< TempType > &betas
7272 ){
7373 const size_t n_replicas = states.size ();
74+ const size_t s = spmd<>::pid ();
75+ const size_t nprocs = spmd<>::nprocs ();
76+ grb::RC rc = grb::SUCCESS;
77+ struct data {
78+ grb::Vector< StateType, backend > *s;
79+ EnergyType e;
80+ TempType b;
81+ int r;
82+ };
83+ static struct data msg[ 2 ];
84+ int rand = std::rand ();
7485
75- for ( size_t i = 1 ; i < n_replicas ; ++i ){
76- const EnergyType de = ( energies[ i ] - energies[ i-1 ]) * (betas[ i ] - betas[ i-1 ]);
86+ for ( int si = static_cast < int >( nprocs ) - 1 ; si >= 0 ; --si ){
87+ if ( si == static_cast < int >( s ) ){
88+ for ( size_t i = n_replicas - 1 ; i > 0 ; --i ){
89+ const EnergyType de = ( energies[ i ] - energies[ i-1 ]) * (betas[ i ] - betas[ i-1 ]);
7790
78- if ( de >= 0 || std::rand () < RAND_MAX * exp ( de ) ){
79- std::swap ( states[i], states[i-1 ] );
80- std::swap ( energies[i], energies[i-1 ] );
91+ if ( de >= 0 || std::rand () < RAND_MAX * exp ( de ) ){
92+ std::swap ( states[i], states[i-1 ] );
93+ std::swap ( energies[i], energies[i-1 ] );
94+ }
95+ }
96+ msg[ 1 ].s = &states[ 0 ];
97+ msg[ 1 ].e = energies[ 0 ];
98+ msg[ 1 ].b = betas[0 ];
99+ msg[ 1 ].r = rand;
100+ }else if ( si == static_cast < int >( s ) + 1 ){
101+ msg[ 0 ].s = &states[ n_replicas - 1 ];
102+ msg[ 0 ].e = energies[ n_replicas - 1 ];
103+ msg[ 0 ].b = betas[ n_replicas - 1 ];
104+ msg[ 0 ].r = rand;
105+ }
106+ if ( si == 0 ) continue ;
107+ rc = rc ? rc : grb::collectives<>::broadcast ( msg[ 0 ], si-1 );
108+ rc = rc ? rc : grb::collectives<>::broadcast ( msg[ 1 ], si );
109+
110+ const EnergyType de = ( msg[ 1 ].e - msg[ 0 ].e ) * ( msg[ 1 ].b - msg[ 0 ].b );
111+
112+ if ( de >= 0 || msg[ 0 ].r < RAND_MAX * exp ( de ) ){
113+ if ( si == static_cast < int >( s ) ){
114+ states[ 0 ] = *msg[ 0 ].s ;
115+ energies[ 0 ] = msg[ 0 ].e ;
116+ }else if ( si == static_cast < int >( s ) + 1 ){
117+ states[ n_replicas-1 ] = *msg[ 1 ].s ;
118+ energies[ n_replicas-1 ] = msg[ 1 ].e ;
119+ }
81120 }
82121 }
83122
84- return grb::SUCCESS ;
123+ return rc ;
85124 }
86125
87126 /*
0 commit comments