如何使用Streams正确加速Cupy?

问题描述

我想使用 cuda 流来加速 GPU 上的小计算。到目前为止,我的测试包括以下内容

import cupy as xp
import time
x = xp.random.randn(10003,20000) + 1j * xp.random.randn(10003,20000)
y = xp.zeros_like(x)

nStreams = 16
streams = [xp.cuda.stream.Stream() for ii in range(nStreams)]

f = xp.fft.fft(x[:,:200])

t = time.time()
for ii in range(int(x.shape[1]/100)):
    ss = streams[ii % nStreams]
    with ss:
        y[:,ii*200:(ii+1)*200] = xp.fft.fft(x[:,ii*200:(ii+1)*200],axis=0)

for ii,ss in enumerate(streams):
    ss.synchronize()
print(time.time()-t)

t = time.time()
for ii in range(int(x.shape[1]/100)):
    y[:,axis=0)
xp.cuda.Stream.null.synchronize()

print(time.time()-t)

生产

[user@pc snippets]$ intelpython3 strm.py
0.019365549087524414
0.018717050552368164

我很难相信我所做的一切都是正确的。此外,当将 FFT 调用替换为对 xp.sum调用时,情况变得更加严重,这会产生

[user@pc snippets]$ intelpython3 strm.py
0.002195596694946289
0.001004934310913086

cupy 流背后的原理是什么?我如何利用它们来发挥我的优势?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)