【发布时间】:2020-07-09 23:13:26
【问题描述】:
我从 Cupy 的文档中阅读了有关如何同时使用 cupy 和 numba 以及使用 cuda 加速代码的示例。 https://docs-cupy.chainer.org/en/stable/reference/interoperability.html
我写了一个类似的代码来测试它:
import cupy
from numba import cuda
import numpy as np
import time
@cuda.jit('void(float32[:], float32[:], float32[:])')
def add(x, y, out):
start = cuda.grid(1)
stride = cuda.gridsize(1)
for i in range(start, x.shape[0], stride):
out[i] = x[i] + y[i]
a = cupy.arange(10000000)
b = a * 2
out = cupy.zeros_like(a)
print("add function time consuming:")
s = time.time()
add(a, b, out)
e = time.time()
print(e-s)
s = time.time()
print("out[2]:")
print(out[2])
e = time.time()
print("the time of transfering out[2] out of GPU:")
print(e-s)
s = time.time()
new_OUT = a + b
print("new out[2] which only use cupy:")
print(new_OUT[2])
e = time.time()
print("the total time of running cupy addition and transfering new out[2] out of GPU:")
print(e-s)
输出是:
add function time consuming:
0.0019025802612304688
out[2]:
6
the time of transfering out[2] out of GPU:
1.5608515739440918
new out[2] which only use cupy:
6
the total time of running cupy addition and transfering new out[2] out of GPU:
0.002993345260620117
第一种情况下out[2]的调用怎么会这么慢?
我正在编写一些需要处理一些cupy数组和矩阵的函数。这些函数工作正常,但是在运行这些函数之后,当我需要进行一些修改时,甚至调用out.shape 之类的东西都非常慢(我的矩阵和数组非常庞大)。
我不确定这里发生了什么,因为 cupy 也使用 cuda,所以当我调用 a + b 时,它应该在 GPU 上运行,但是当我调用 out[2] 来检查 out[ 2]。但是第一种情况消耗超高。
【问题讨论】: