2017-01-11 49 views
1

据我所知TF只要并行调用多个运算符并行。 (linkTensorFlow:指定并行运行的Ops数

而并行可通过inter_op_parallelism_threadsintra_op_parallelism_threads如果在CPU(link)运行运营商ARë来控制。但是,这些参数完全不会影响GPU运算符。我该如何控制GPU的并行性? (例如,运行操作人员连续虽然有独立的运营商)

编辑:

a=tf.random_normal([N,N]) 
b=tf.random_normal([N,N]) 
c=tf.random_normal([N,N]) 
d=tf.random_normal([N,N]) 

x=tf.matmul(a,b) 
y=tf.matmul(c,d) 
z=tf.matmul(x,y) 
+0

GPU仅运行在时间s一个计算运算 –

+0

http://stackoverflow.com/questions/39481453/tensorflow-device-contexts-streams-and-context-switching –

+0

@YaroslavBulatov然后sess.run(z)的应采取比sess.run 3倍(x),对吗?但是,在我的实验中,它只需要2倍。 – enc

回答

2

这里有一个方法来分析执行,避免常见的陷阱:

# Turn off graph-rewriting optimizations 
config = tf.ConfigProto(graph_options=tf.GraphOptions(optimizer_options=tf.OptimizerOptions(opt_level=tf.OptimizerOptions.L0))) 

# throw error if explicit device placement can't be satisfied 
config.allow_soft_placement = False 

N = 8192 
with tf.device("/gpu:0"): 
    input1 = tf.Variable(tf.random_normal([N,N])) 
    input2 = tf.Variable(tf.random_normal([N,N])) 
    result = tf.matmul(input1, input2) 
    result_no_output = result.op # to avoid transferring data back to Python 
sess = tf.Session(config=config) 

# load values into GPU 
sess.run(tf.global_variables_initializer()) 

# pre-warming 
sess.run(result_no_output) 

num_ops = N**3 + N**2*(N-1) # N^3 muls, N^2 (N-1) adds 
elapsed = [] 
for i in range(10): 
    start = time.time() 

    sess.run(result_no_output) 
    elapsed.append(time.time()-start) 

print("%d x %d matmul, %.2f elapsed, %.2f G ops/sec"%(N, N, min(elapsed), num_ops/min(elapsed)/10**9)) 

在TitanX帕斯卡这表明9.5 T ops/sec接近理论最大值11 T ops/sec理论最大值

8192 x 8192 matmul, 0.12 elapsed, 9527.10 G ops/sec