MACs

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}}