为什么这个矩阵乘法慢(Turing GPU)?

问题描述 投票:-1回答:1

根据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可获得多少数字,因为我链接的表仅显示了硬件限制。

performance cuda pytorch matrix-multiplication cublas
1个回答
0
投票

理论上的FLOPS计算远非现实。例如,fused-multiply-add是单个硬件指令,但威胁为2 FLOPS。然后,您有10个可以执行fused-multiply-add的硬件单元。并且您可以声明硬件每个时钟周期具有20 FLOPS。

实际上,您的程序无法完全加载管道以100%使用每个硬件单元。在任何程序中,管道停顿都是完全正常的。另外,不要忘记内存访问延迟。

矩阵乘法受内存限制。这就是为什么您只看到理论FLOPS的60%,这是一个非常高的数字。

© www.soinside.com 2019 - 2024. All rights reserved.