Je voudrais maintenir une variable sur le GPU, et effectuer certaines opérations sur cette variable en place. L'extrait suivant est un exemple minimal de ceci.condition de la course de fixation dans tensorflow
import numpy as np
import tensorflow as tf
with tf.Graph().as_default():
i = tf.placeholder(tf.int32, [4], name='i')
y = tf.placeholder(tf.float32, [4], name='y')
_x = tf.get_variable('x', [4], initializer=tf.random_normal_initializer())
x = _x + tf.reduce_sum(tf.mul(_x,y))
assign_op = tf.assign(_x, x).op
permute_op = tf.assign(_x, tf.gather(_x, i))
ii = np.array([1,2,3,0])
yy = np.random.randn(4)
s = tf.Session()
s.run(tf.initialize_all_variables())
xxx0 = s.run(_x)
s.run([permute_op, assign_op], feed_dict={i: ii, y: yy})
xxx1 = s.run(_x)
print('assigned then permuted', np.allclose((xxx0+np.dot(xxx0,yy))[ii], xxx1))
print('permuted then assigned', np.allclose((xxx0[ii]+np.dot(xxx0[ii], yy)), xxx1))
Le problème est que ce programme est ambigu, en termes de l'ordre des opérations de assign_op et permute_op. Par conséquent, l'une ou l'autre des deux dernières instructions d'impression sera vraie, mais celle qui est varie de façon aléatoire entre plusieurs exécutions du programme. Je pourrais casser ceci en deux étapes, la première exécutant le permute_op et la deuxième exécutant le assign_op, mais il semble que ce soit moins efficace. Y at-il un moyen efficace de briser les conditions de concurrence et de rendre les résultats prévisibles?
explication Nice, merci. – user6473715