Skip to content

Commit 7beec2f

Browse files
committed
Spmd with broadcast - to be tested
1 parent 8f67ed9 commit 7beec2f

File tree

1 file changed

+45
-6
lines changed

1 file changed

+45
-6
lines changed

include/graphblas/algorithms/simulated_annealing_re.hpp

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)