![](/img/trans.png)
[英]why cupy automatically transfer data from GPU memory to CPU memory?
[英]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)
我使用带有record
和synchronize
功能的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.