@@ -93,19 +93,18 @@ void ListenAndServOp::RunSyncLoop(
93
93
framework::Executor *executor, framework::ProgramDesc *program,
94
94
framework::Scope *recv_scope,
95
95
const std::vector<int > &prefetch_block_id_list) const {
96
- // FIXME(qiao) ParallelExecuteBlocks should only execute optimize blocks.
97
- // the prefetch blocks should not be executed. Currently we put prefetch
98
- // blocks
99
- // at the end of programs. This may be misused.
100
96
size_t num_blocks = program->Size ();
101
97
PADDLE_ENFORCE_GE (num_blocks, 2 ,
102
98
" server program should have at least 2 blocks" );
103
99
104
- std::vector<int > block_list;
105
- for (int blkid = 1 ; blkid < prefetch_block_id_list[0 ]; ++blkid) {
106
- block_list.push_back (blkid);
100
+ std::vector<int > optimize_block_id_list;
101
+ for (int blkid = 1 ; blkid < num_blocks; ++blkid) {
102
+ if (std::find (prefetch_block_id_list.begin (), prefetch_block_id_list.end (),
103
+ blkid) == prefetch_block_id_list.end ()) {
104
+ optimize_block_id_list.push_back (blkid);
105
+ }
107
106
}
108
- auto optimize_prepared = executor->Prepare (*program, block_list );
107
+ auto optimize_prepared = executor->Prepare (*program, optimize_block_id_list );
109
108
// Insert placeholder for block0 which holds current op itself.
110
109
optimize_prepared.insert (
111
110
optimize_prepared.begin (),
@@ -132,7 +131,10 @@ void ListenAndServOp::RunSyncLoop(
132
131
std::vector<size_t > parallel_blkids;
133
132
parallel_blkids.push_back (1 );
134
133
double ts = detail::GetTimestamp ();
135
- for (int blkid = 2 ; blkid < prefetch_block_id_list[0 ]; ++blkid) {
134
+ for (size_t i = 1 ; i < optimize_block_id_list.size (); ++i) {
135
+ // skip the first optimize block because it is already in the
136
+ // parallel_blkids.
137
+ int blkid = optimize_block_id_list[i];
136
138
if (program->Block (blkid).Parent () != last_parent_blkid) {
137
139
ParallelExecuteBlocks (parallel_blkids, executor, optimize_prepared,
138
140
program, recv_scope);
0 commit comments