テンソルフローの公式ガイドを読んでいたときに、操作の明示的なデバイス配置を示す1つの例があります。この例では、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で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で簡単に実行できるわけではありません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加