MACs#
参考:MACs
MACs: mutiply-accumulate operations
在计算中,特别是在数字信号处理中,乘法累加(MAC)或乘法加法(MAD)运算是常见的步骤,用于计算两个数的乘积并将该乘积添加到累加器中。执行此操作的硬件单元称为乘法累加器(MAC 单元);该操作本身也经常被称为 MAC 或 MAD 操作。MAC 操作修改累加器 a
:
\[
a \leftarrow a + (b \times c)
\]
当使用浮点数时,可能会执行两次舍入(在许多 DSPs 中是典型的),或只执行一次舍入。当只执行一次舍入时,它被称为融合乘法加法(FMA)或融合乘法累加(FMAC)。现代计算机可能包含专用的 MAC,由组合逻辑实现的乘法器、加法器和存储结果的累加器寄存器组成。寄存器的输出反馈到加法器的输入端,因此每个时钟周期,乘法器的输出被添加到寄存器中。组合乘法器需要大量的逻辑,但可以比早期计算机的典型移位和相加方法更快地计算乘积。
import torch.nn as nn
from torch_book.scan.crawler import summary, crawl_module
mod = nn.Conv2d(3, 8, 3)
summary(mod, (3, 224, 224), receptive_field=True)
___________________________________________________________________
Layer Type Output Shape Param # Receptive field
===================================================================
conv2d Conv2d (-1, 8, 222, 222) 224 3
===================================================================
Trainable params: 224
Non-trainable params: 0
Total params: 224
-------------------------------------------------------------------
Model size (params + buffers): 0.00 Mb
Framework & CUDA overhead: 254.00 Mb
Total RAM usage: 254.00 Mb
-------------------------------------------------------------------
Floating Point Operations on forward: 21.29 MFLOPs
Multiply-Accumulations on forward: 10.65 MMACs
Direct memory accesses on forward: 11.04 MDMAs
___________________________________________________________________
input_shape = (3, 224, 224)
module_info = crawl_module(mod, input_shape)
module_info
{'overheads': {'cuda': {'pre': 254.0, 'fwd': 254.0},
'framework': {'pre': 0.0, 'fwd': 0.0}},
'layers': [{'name': 'conv2d',
'depth': 0,
'type': 'Conv2d',
'input_shape': (-1, 224, 224),
'output_shape': (-1, 8, 222, 222),
'grad_params': 224,
'nograd_params': 0,
'param_size': 896,
'num_buffers': 0,
'buffer_size': 0,
'flops': 21290688,
'macs': 10645344,
'dmas': 11039840,
'rf': 3,
's': 1,
'p': 0,
'is_shared': False,
'is_leaf': True}],
'overall': {'grad_params': 224,
'nograd_params': 0,
'param_size': 896,
'num_buffers': 0,
'buffer_size': 0}}