为什么此操作在CPU上比GPU执行速度更快?

3

我在阅读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

有时将数据发送到设备并返回需要更长的时间。 - Bryce Wayne
特定的GPU是否在Tensorflow支持的硬件列表中?此外,GPU和CPU的规格是什么?https://www.tensorflow.org/install/gpu - Charles Green
@CharlesGreen 感谢您的评论。我认为它已经在列表中了。此外,这是官方的代码示例。 - zihaozhihao
1
@BryceWayne 我理解你的意思。 - zihaozhihao
1个回答

6

GPU具有高内存带宽和大量并行计算单元。易于并行化或数据密集型操作将受益于GPU执行。例如,矩阵乘法涉及大量可以并行完成的乘法和加法。

CPU具有低的内存延迟(当一次读取大量数据时,这变得不那么重要),以及丰富的指令集。当您需要进行顺序计算(斐波那契数列可能是一个例子),经常进行随机内存读取,具有复杂控制流等时,CPU性能突出。

官方博客中的差异在于,PRNG算法通常是顺序的,并且无法有效地利用并行化操作。但总体而言,最新的CUDA版本已经具有PRNG内核,在此类任务上的表现优于CPU。

对于上面的示例,在我的系统上,CPU花费了65毫秒,GPU花费了0.3毫秒。此外,如果我将采样大小设置为[5000, 5000],则CPU时间为7500毫秒,而GPU保持不变,为0.3毫秒。另一方面,对于[10, 10],它是CPU:0.18ms(最高可达0.4ms) vs GPU:0.25ms。这清楚地表明,即使是单个操作的性能也取决于数据的大小

回到问题的答案。将操作放在GPU上可能有利于易于并行化的操作,这些操作可以用较少的内存调用计算。另一方面,CPU在需要高数量低延迟(即少量数据)内存调用时表现突出。此外,并非所有操作都可以轻松地在GPU上执行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接