簡體   English   中英

只有 GPU 到 CPU 的 cupy 傳輸非常慢

[英]Only GPU to CPU transfer with cupy is incredible slow

如果我在 GPU 上有一個數組,復制回形狀數組 (20, 256, 256) 真的很慢(數百秒的數量級)。

我的代碼如下:

import cupy as cp
from cupyx.scipy.ndimage import convolve
import numpy as np

# Fast...
xt = np.random.randint(0, 255, (20, 256, 256)).astype(np.float32)
xt_gpu = cp.asarray(xt)

# Also very fast...
result_gpu = convolve(xt_gpu, xt_gpu, mode='constant')

# Very very very very very slow....
result_cpu = cp.asnumpy(result_gpu)

我使用帶有recordsynchronize功能的cp.cuda.Event()測量了時間,以避免測量任何隨機時間,但結果仍然相同,GPU->CPU 傳輸非常慢。 但是,使用 PyTorch 或 TensorFlow 情況並非如此(出於類似數據大小/形狀的經驗)......我做錯了什么?

我想你可能時間錯了。 我修改了代碼以在每個 GPU 操作之間同步,似乎卷積花費了大部分時間,兩個傳輸操作都非常快。

import cupy as cp
from cupyx.scipy.ndimage import convolve
import numpy as np
import time
# Fast...
xt = np.random.randint(0, 255, (20, 256, 256)).astype(np.float32)

t0 = time.time()
xt_gpu = cp.asarray(xt)
cp.cuda.stream.get_current_stream().synchronize()
print(time.time() - t0)

# Also very fast...
t0 = time.time()
result_gpu = convolve(xt_gpu, xt_gpu, mode='constant')
cp.cuda.stream.get_current_stream().synchronize()
print(time.time() - t0)

# Very very very very very slow....
t0 = time.time()
result_cpu = cp.asnumpy(result_gpu)
cp.cuda.stream.get_current_stream().synchronize()
print(time.time() - t0)

輸出:

0.1380000114440918
4.032999753952026
0.0010001659393310547

在我看來,您在測試時實際上並沒有在調用之間進行同步。 在傳輸回 numpy 數組之前,所有操作都只是排隊,並且似乎無需同步調用即可立即完成。 這將導致測量的 GPU->CPU 傳輸時間實際上是卷積和傳輸的時間。

我也遇到了同樣的問題,我發現訪問 Float64 數據比 Float32 快得多,也許你可以試試 to.astype(float64)。

暫無
暫無

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

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