正确测试代码在cuda运行时间,需要加上torch.cuda.synchronize()
,使用该操作来等待GPU全部执行结束,CPU才可以读取时间信息。
两种测试时间的方式
第一种:
start = time.time()
result = model(input)
end = time.time()
第二种:
torch.cuda.synchronize() #增加同步操作
start = time.time()
result = model(input)
torch.cuda.synchronize() #增加同步操作
end = time.time()
一共上述两种测试时间的方式,正确的方式是第二种,为什么是这样呢?在pytorch里面,程序的执行都是异步的。如果采用第一种方式,测试的时间会很短,因为执行完end=time.time()程序就退出了,后台的cuda也因为python的退出退出了,如果采用第二种方式,代码会同步cuda的操作,等待gpu上的操作都完成了再继续运行end = time.time() .
但是,如果将第一段代码改为
start = time.time()
result = model(input)
print(result) #增加print
end = time.time()
这时候会发现第三种方法和第二种方法的时间是差不多的,这是因为第三段代码会等待gpu上的结果执行完传给print函数,所以时间就和第二段同步操作的时间基本上是一致的了,将print(result)换成result.cpu()结果是一致的了。