当我阅读tensorflow官方指南时,有一个例子显示了操作的显式设备布局。在这个例子中,为什么CPU执行的时间少于GPU?更常见的是,哪种操作在GPU上执行得更快?
import time
def time_matmul(x):
start = time.time()
for loop in range(10):
tf.matmul(x, x)
result = time.time()-start
print("10 loops: {:0.2f}ms".format(1000*result))
# Force execution on CPU
print("On CPU:")
with tf.device("CPU:0"):
x = tf.random.uniform([1000, 1000])
assert x.device.endswith("CPU:0")
time_matmul(x)
# Force execution on GPU #0 if available
if tf.test.is_gpu_available():
print("On GPU:")
with tf.device("GPU:0"): # Or GPU:1 for the 2nd GPU, GPU:2 for the 3rd etc.
x = tf.random.uniform([1000, 1000])
assert x.device.endswith("GPU:0")
time_matmul(x)
### Output
# On CPU:
# 10 loops: 107.55ms
# On GPU:
# 10 loops: 336.94ms发布于 2019-06-16 06:09:35
GPU具有较高的存储带宽和大量的并行计算单元。易于并行或数据繁重的操作将受益于GPU的执行.例如,矩阵乘法涉及大量可以并行执行的乘法和加法。
CPU具有较低的内存延迟(当您同时读取大量数据时,这就变得不那么重要了)和一组丰富的指令。当你不得不进行顺序计算(斐波纳基数可能是一个例子)时,它就会发光,必须经常随机读取内存,有复杂的控制流等等。
官方博客的不同之处在于PRNG算法通常是顺序的,不能有效地利用并行操作。但这只是一般情况。最新的CUDA版本已经拥有PRNG内核,并且在这类任务上性能优于CPU。
谈到上面的例子,在我的系统中,CPU上有65 my,GPU上有0.3ms。此外,如果我将采样大小设置为5000,5000将变为CPU:7500 if,而对于GPU,它将保持相同的GPU:0.3ms。另一方面,10是CPU:0.18 (最多0.4ms )和GPU:0.25ms。它清楚地表明,即使是单个操作性能也取决于数据的大小。
回到答案。在GPU上放置操作可能有利于容易并行的操作,这些操作可以用少量的内存调用来计算。另一方面,当涉及到较高数量的低延迟(即少量数据)内存调用时,CPU会发光。此外,并不是所有的操作都可以轻松地在GPU上执行。
https://stackoverflow.com/questions/56615277
复制相似问题