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

时间:2019-06-16 00:56:55

标签: python tensorflow

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

1 个答案:

答案 0 :(得分:5)

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

CPU具有较低的内存延迟(当您一次读取大量数据时,它的重要性变得不那么重要)和一组丰富的指令。当您必须执行顺序计算(斐波那契数字可能是一个例子),必须经常进行随机存储器读取,具有复杂的控制流程等时,它会亮起来。

官方博客中的差异是由于以下事实:PRNG算法通常是顺序的,无法有效地安静地利用并行化操作。但这是一般情况。最新的CUDA版本已经具有PRNG内核,并且在此类任务上的性能优于CPU。

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

返回答案。将操作放置在GPU上可能有利于易于并行化的操作,这些操作可以用较少的内存调用来计算。另一方面,当涉及大量低延迟(即少量数据)的内存调用时,CPU会发光。此外,并非所有操作都可以在GPU上轻松执行。