||
调用cula和cublas的device接口的函数时,有一个根本的不同:调用cublas是立即返回,而调用cula则不同,是要等到程序运行完毕才返回。以下是测试的例子:
zgemm(cublas):
call cpu_time(t0)
call cublas_device_zgemm('N', 'N', nd, nd, na, -alpha, C_d, nd, F_d, na, alpha, D_d, nd)
call cpu_time(t1)
print *,'zgemm:',t1-t0
D=D_d
call cpu_time(t2)
D=D_d
call cpu_time(t3)
print *,'copy1:',t2-t1
print *,'copy2:',t3-t2
运行结果:
zgemm: 2.2888184E-05
copy1: 6.989143
copy2: 6.0188293E-02
不要以为zgemm运行只要0.00002秒,而数据拷贝用了近7分钟。这其实是一个假象。调用zgemm的函数,还没运行完毕,CPU立刻返回了。但接下来的D=D_d,却要等到前面的zgemm运行完毕才会开始传递数据。实际上,这6秒的时间是zgemm的运行时间。也就是在传递数据前,这个拷贝语句等待了6秒。再看第2个拷贝语句,只需要0.06秒,这才是真实的数据传递的时间。
zgesv(cula):
call cpu_time(t0)
info= cula_device_zgesv(na,na,A_d,na,ipiv_d,A_I_d,na)
call cpu_time(t1)
print *,'zgesv:',t1-t0
A=A_I_D
call cpu_time(t2)
print *,'copy:',t2-t1
运行结果:
zgesv: 10.26568
copy: 6.0382843E-02
这里10.26秒的时间是zgesv真正运行的时间,0.06秒是数据传递的时间。可见,在调用cula的时候,CPU要等到程序运行完毕才返回。
因此,在调用cublas中的库函数时,在读取显存中的数据之前,可以充分利用这段时间做一些事情。而调用cula则不能,因为它必须等到程序完毕了才能返回。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-24 09:52
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社