'Adds ops to enqueue on all worker queues.
Args:
name: prefixed for the shared_name of ops.
dependencies: control dependency from ops.
Returns:
an op that should be used as control dependency before starting next step.'

def _add_sync_queues_and_barrier(self, name, dependencies):

    self.sync_queue_counter += 1
    with tf.device(self.sync_queue_devices[(self.sync_queue_counter % len(self.sync_queue_devices))]):
        sync_queues = [tf.FIFOQueue(self.num_worker, [tf.bool], shapes=[[]], shared_name=('%s%s' % (name, i))) for i in range(self.num_worker)]
        queue_ops = []
        token = tf.constant(False)
        with tf.control_dependencies(dependencies):
            for (i, q) in enumerate(sync_queues):
                if (i != self.task_index):
                    queue_ops.append(q.enqueue(token))
        queue_ops.append(sync_queues[self.task_index].dequeue_many((len(sync_queues) - 1)))
        return tf.group(name=name, *queue_ops)
