簡體   English   中英

為什么這個操作在CPU上比GPU執行得更快?

[英]Why does this operation execute faster on CPU than GPU?

當我閱讀tensorflow官方指南時,有一個示例顯示操作的Explicit Device Placement。 在這個例子中,為什么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

GPU具有高內存帶寬和大量並行計算單元。 GPU執行可以輕松實現可並行化或數據繁重的操作。 例如,矩陣乘法涉及可以並行完成的大量乘法和加法。

CPU具有較低的內存延遲(當您一次讀取大量數據時變得不那么重要)和豐富的指令集。 當你不得不進行順序計算時(光纖數字可能是一個例子),它必須經常進行隨機存儲讀取,具有復雜的控制流等。

官方博客的不同之處在於,PRNG算法通常是順序的,不能有效地利用並行操作。 但這是一般的。 最新的CUDA版本已經擁有PRNG內核,並且在這些任務上的表現優於CPU。

說到上面的例子,在我的系統上,CPU上有65ms,GPU上有0.3ms。 此外,如果我將采樣大小設置為[5000,5000]則變為CPU:7500ms,而對於GPU,它保持相同的GPU:0.3ms。 另一方面,fo [10,10]是CPU:0.18(盡管最多0.4ms)vs GPU:0.25ms。 它清楚地表明,即使單個操作性能也取決於數據大小

回到答案。 在GPU上放置操作可能對於可以使用少量內存調用計算的易於並行化的操作是有益的。 另一方面,當涉及到大量低延遲(即少量數據)內存調用時,CPU會發光。 此外,並非所有操作都可以在GPU上輕松執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM