cache读写策略(write-back/through)与分配策略(allocate)

1.allocate

先确定一下allocate的概念,就是在cache miss的时候,去内存中读写数据过程中给这个数据分配cacheLine并存储到cache。

其中write-allocate可以分为两种情况:

  • 先读要改写数据对应的cacheLine大小的数据回来,存储到新分配的cacheLine上,然后将要修改的写数据更新到cacheLine中
  • 直接分配cacheLine,将数据存储到该cacheLine

以上两种fill cacheline的过程适用于不同的情况,第一种适用于写数据不是整个cacheLine大小,由于和内存交互的最小单元是cacheLine,所以只能先读整个cacheLine,这个过程称为读改写

显然第二种就属于完全替换整个cacheLine的情况,当然完全替换整个cacheLine也可以采用第一种方式。

必须要分清的是read trans miss对应的是read allocate;而write trans miss对应的是write allocate,即使write miss后allocate的cacheLine的fill可能需要从内存中读数据。

2.cache的读策略与read allocate

上表是ArmV8架构手册给出的memType及mem属性,在cacheability中cacheable为何只有write-Through Cacheable和Write-Back Cacheable而没有提到read的属性呢?

我们在说write-Through和write-back cache的时候,并不是说该cache不能支持读trans,而是因为默认情况下write-through和write-back的cache的读策略都是一样的。

对于cacheable的trans,读首先要在cache中查找

  • 如果hit,那么就得到所需的数据
  • 如果miss就去内存中读取

在miss后读取内存的过程中,对读回的数据处理又分了两类

  • read allocate :就是将读回的数据分配一个cacheLine存储在cache中
  • read non-allocate:读回的数据直接给master使用,而不在cache中缓存

而默认情况下都是使用read allocate的cache【无论是write-back还是write-through】

3.cache的写策略与write allocate

常用的cache写策略是write-back和write-through,Arm目前也支持这两种回写策略,还有其他的策略不在这里体现。

既然是cacheable的写trans,首先到cache中查找,若:

Hit时:

write-through:将写数据更新到cacheLine,同时将该Dirty的cacheLine写到内存中

write-back:直接将数据更新到cacheLine,并不立即写到内存中去,在该cacheLine被逐出cache时,写到内存中。

miss时,按照allocate分为两种情况:

write allocate :此时在cache中分配一个cacheLine(fill cacheLine过程见本文第一章),然后按照hit的情况,分write-back和write-through回写数据

write non-allocate:此时无论write-back还是write-through都是直接将数据写往内存中。

ARM的cache和mem零散记录(属性)-CSDN博客这边博客中提到的write stream mode就是典型的使用write non-allocate的场景。

Traceback (most recent call last): File "/root/autodl-tmp/ultralytics-main/run.py", line 7, in <module> model.train(data='/root/autodl-tmp/ultralytics-main/traindata3/data.yaml') File "/root/autodl-tmp/ultralytics-main/ultralytics/yolo/engine/model.py", line 371, in train self.trainer.train() File "/root/autodl-tmp/ultralytics-main/ultralytics/yolo/engine/trainer.py", line 192, in train self._do_train(world_size) File "/root/autodl-tmp/ultralytics-main/ultralytics/yolo/engine/trainer.py", line 328, in _do_train preds = self.model(batch['img']) File "/root/miniconda3/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl return forward_call(*args, **kwargs) File "/root/autodl-tmp/ultralytics-main/ultralytics/nn/tasks.py", line 219, in forward return self._forward_once(x, profile, visualize) # single-scale inference, train File "/root/autodl-tmp/ultralytics-main/ultralytics/nn/tasks.py", line 70, in _forward_once x = m(x) # run File "/root/miniconda3/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl return forward_call(*args, **kwargs) File "/root/autodl-tmp/ultralytics-main/ultralytics/nn/modules/block.py", line 183, in forward return self.cv2(torch.cat(y, 1)) torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 100.00 MiB (GPU 0; 23.65 GiB total capacity; 6.18 GiB already allocated; 98.56 MiB free; 6.21 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF terminate called without an active exception Aborted (core dumped)
06-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值