问题描述
我最近开始使用 CuPy。在我的应用程序中,函数 einsum
似乎没有一致的执行速度。在下面的第一个示例中,它最多比 tensordot
函数慢 5 倍(例如,对于 M = 128 和 2048)。在下面的第二个示例中,它比 dot
慢,但与 tensordot
一样快。我在使用 einsum
时是否犯了错误?
我的代码:
import numpy as np
import cupy as cp
import timeit
import tabulate
nrepeats = 1000
alpha_max= 11
cp.random.seed(123)
Ts = []
Ms = 2**(1+np.arange(3,alpha_max))
chi = cp.array([[0.,2.5,5.5],[2.5,0.,2.5],[5.5,0. ]])
# 1st test
for M in Ms:
#print(M)
shape = [3,M,M]
ndim = len(shape)
phi = cp.random.rand(*shape)
t_1 = timeit.timeit(lambda: cp.einsum('mn,n...->m...',chi,phi),number=nrepeats) / float(nrepeats)
t_2 = timeit.timeit(lambda: cp.einsum('mn,number=nrepeats) / float(nrepeats)
t_3 = timeit.timeit(lambda: cp.tensordot(chi,phi,axes=([1],[0])),number=nrepeats) / float(nrepeats)
Ts.append([t_1,t_2,t_3])
data = np.array(Ts)
data = np.concatenate([Ms.reshape(-1,1),data],axis=1)
print("1st test")
print(tabulate.tabulate(data,tablefmt='simple',headers=['M'] + ["t_{:d}".format(i) for i in range(1,data.shape[1])]))
print("")
# 2nd test
Ts = []
for M in Ms:
#print(M)
phi = cp.random.rand(M,M)
mat = cp.random.rand(M,M)
t_1 = timeit.timeit(lambda: cp.einsum('mn,mat,number=nrepeats) / float(nrepeats)
t_2 = timeit.timeit(lambda: cp.dot(mat,number=nrepeats) / float(nrepeats)
t_3 = timeit.timeit(lambda: cp.tensordot(mat,axis=1)
print("2nd test")
print(tabulate.tabulate(data,data.shape[1])]))
我的结果:
1st test
M t_1 t_2 t_3
---- ----------- ----------- -----------
16 0.000625728 0.000117246 2.18285e-05
32 0.000116557 0.000116172 2.16212e-05
64 0.000116819 0.000117002 2.15155e-05
128 0.000116461 0.000116047 2.16749e-05
256 0.000159753 0.000240077 7.99196e-05
512 0.00063619 0.00093989 0.000312955
1024 0.0028338 0.00372209 0.00106168
2048 0.0128821 0.0149504 0.00289213
2nd test
M t_1 t_2 t_3
---- ----------- ----------- -----------
16 0.000252584 9.88275e-06 1.89785e-05
32 0.000111875 1.03006e-05 2.8993e-05
64 0.000117031 1.05121e-05 6.57232e-05
128 0.000165988 3.82686e-05 7.81205e-05
256 0.000161549 0.000117307 0.000154361
512 0.000745595 0.000655062 0.000870415
1024 0.00495882 0.00228163 0.00665659
2048 0.0411153 0.017304 0.0508659
我的系统:
- 在基于
nvidia/cuda:11.0-runtime
的 docker 容器中运行。 - GPU。 GeForce RTX 2080 8Gb
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)