根据specs,使用Tensor内核以半精度运行Nvidia RTX 2080 Ti应该能够达到107.6 TeraFLOPS。
但是,在最佳条件下(非常大的矩阵,大小是2的幂),我看到大约60%(不要误会,它仍然非常令人印象深刻,但是我觉得我要离开了桌上很多)
这使用了使用Tensor Core的Pytorch 1.3.1(实际上,没有Tensor Core的硬件限制要低得多)
import torch
from time import time
n = 32*1024
print(2*n**2*3 / 1024**3, 'GB VRAM required') # reduce n, if needed
r = 1000
z = torch.zeros((n, n))
z = z.half()
a = z.cuda()
b = z.cuda()
c = z.cuda()
with torch.no_grad():
for i in range(r):
d0 = time()
torch.matmul(a, b, out=c)
torch.cuda.synchronize() # synchronize the default stream
d1 = time()
tflops = 2*n*n*n / (d1 - d0) / 1e12
print(i+1, '/', r, "%7f" % (d1 - d0), 's', tflops, 'TFLOPS')
顺便说一句,我很好奇人们使用其他GPU可获得多少数字,因为我链接的表仅显示了硬件限制。
理论上的FLOPS计算远非现实。例如,fused-multiply-add
是单个硬件指令,但威胁为2 FLOPS。然后,您有10个可以执行fused-multiply-add
的硬件单元。并且您可以声明硬件每个时钟周期具有20 FLOPS。
实际上,您的程序无法完全加载管道以100%使用每个硬件单元。在任何程序中,管道停顿都是完全正常的。另外,不要忘记内存访问延迟。
矩阵乘法受内存限制。这就是为什么您只看到理论FLOPS的60%,这是一个非常高的数字。