为什么这个操作在CPU上执行得比GPU快?

2024-03-28 20:11:45 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: forgputimeondevicetfresultcpu
1条回答
网友
1楼 · 发布于 2024-03-28 20:11:45

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

CPU具有较低的内存延迟(当您一次读取大量数据时,内存延迟就变得不那么重要)和丰富的指令集。当你必须进行顺序计算(fibonachi数可能是一个例子)、必须经常进行随机内存读取、有复杂的控制流等时,它会发光

官方博客中的差异是因为PRNG算法通常是顺序的,不能有效地利用并行操作。但这是一般情况。最新的CUDA版本已经有PRNG内核,并且在这类任务上比CPU表现更好。你知道吗

当谈到上面的例子,在我的系统上,我得到65毫秒的CPU和0.3毫秒的GPU。此外,如果我将sampling size设置为[5000,5000],它将变为CPU:7500ms对于GPU,它保持不变GPU:0.3ms.开另一只手是CPU:0.18(最多0.4ms)与GPU:0.25ms。它清楚地表明,即使是单个操作的性能也取决于数据的大小。你知道吗

回到答案上来。将操作放在GPU上可能有利于使用较少的内存调用来计算易于并行化的操作。另一方面,CPU在处理大量低延迟(即少量数据)内存调用时表现出色。此外,并非所有操作都可以在GPU上轻松执行。你知道吗

相关问题 更多 >