繁体   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