Tensorflow没有将操作链接到单个CUDA内核中

时间:2018-02-05 19:53:22

标签: tensorflow

我刚刚开始学习如何使用Tensorflow并遇到了一个让我怀疑自己应该如何运作的问题。我想大致了解一下我应该在GPU上使用基本算术运算获得多少性能。我创建一个1亿个元素的一维张量,然后在这个张量上链接1000个加法运算。我的期望是Tensorflow运行时能够将这些操作链接到在GPU上执行的单个CUDA内核,但是当我运行它时,似乎每个操作都是单独发布给GPU的。我的gtx 1080 ti需要大约5秒才能完成,大约可以提供20 Gflops。在运行时,python.exe正在耗尽一个完整的CPU核心,Nvidia Nsight显示正在提交的许多内核。相比之下,当我尝试看看我用Alea.GPU得到的东西时,我得到了3Tflops并发布了一个CUDA内核。

我是否误解了基本操作应该如何在GPU上运行?是获得良好GPU效率以手动将操作分组到更复杂的自定义操作或使用更高级别ML功能的唯一方法吗?

谢谢。

import tensorflow as tf
import time

TENSOR_SIZE=100000000
TF_REP=1000

def testSpeed(x):
    tf.InteractiveSession();

    z=tf.zeros(TENSOR_SIZE)

    for i in range(0, TF_REP):
        z=tf.add(z,x)

    return tf.reduce_sum(z).eval();

x=tf.range(0.0, TENSOR_SIZE)


t0=time.perf_counter()  
testSpeed(x)
t1=time.perf_counter()

print("Time taken "+str(t1-t0)+"s gflops= " + str(TENSOR_SIZE * TF_REP / 1000000000.0 / (t1 - t0)))

1 个答案:

答案 0 :(得分:0)

首先,您应该将您的代码分为两个阶段,一个build_graph阶段,它定义了各种张量。我建议在一个名为build_graph()的函数中收集它们。然后创建会话并通过它运行数据。您正在尝试将过程编程技术应用于命令式库。

接下来是将数据交换到GPU上或从GPU上移除的问题。当您运行tf.reduce_sum(z).eval()时,您每次都会将结果从GPU复制回CPU。

最后,您正在使用tf.InteractiveSession()创建多个会话,您应该只创建一个会话。回到第一个问题来解决这个问题。最佳实践是在创建会话后永远不会创建tensorflow OP。 Tensorflow将允许您,但作为最佳实践不会,如果您正确编码,则不需要。如果您需要,请发布一个问题,询问为什么在创建会话之前无法定义XYZ,而且有人几乎肯定会对工作流程进行更正。