ARM Architecture의 DMB, DSB 개념

Hyobyung Han·2022년 4월 3일
0

ARM

목록 보기
2/2

Introduction

ARM Architecture의 DMB, DSB, ISB 에 대해 설명한다.

  • DMB: Data Memory Barrier
  • DSB: Data Synchronization Barrier
  • ISB: Instruction Synchronization Barrier

Backgrounds

DMB와 DSB에 대해 설명하기 전에, ARM architecture에서는 여러가지 이유로 instruction의 순서가 뒤바낄 수 있다.

Instruction Reordering

옛날옛적에는 컴퓨터 프로그램은 소스코드에 쓰여진 코드 순서 그대로 동작했었다. (이를 Sequential Execution Model 이라고도 부른다.)

사실 순서대로 진행되는 방식이 적절해보일 수는 있지만, 성능 측면에서는 최적화되지 않을 수 있다.

예를 들어 다음과 같은 코드가 있다고 가정해보자.
여기서 memory access가 필요한 str, ldr은 1 cycle 이상 소요될 수 있다.


add r0, r0, #4
mul r2, r2, r3
str r2, [r0]
ldr r4, [r1]
sub r1, r4, r2
bx lr

이 코드를 in-order 프로세서에서 실행시키면 Data hazard를 방지하기 위해 memory access 이후 stall되어 다음과 같이 동작할 수 있다.

add r0, r0, #4
mul r2, r2, r3 
*stall*
str r2, [r0]
ldr r4, [r1]
*stall*
sub r1, r4, r2
bx lr

만약, out-of-order를 지원하는 프로세서에서 위의 코드를 동작시키면 다음과 같이 동작할 수 있다.
즉, 서로 dependency가 없는 LDRSTR의 순서를 reordering함으로써, MUL이 수행될 때까지 LDR을 먼저 수행한 다음 곧바로 STR 이 실행될 수 있는 것이다.

add r0, r0, #4
mul r2, r2, r3
ldr r4, [r1]
str r2, [r0]
sub r1, r4, r2
bx lr

이외에도, latency를 줄이기 위해 Load and store의 경우 프로세서에서 여러 memory acesss instruction들을 하나로 합친다던지, latency를 줄이기 위해 compiler에 의해 최적화된다던지 등등.. 여러가지 이유로 instruction의 순서는 바뀔 수 있다.

DMB(Data Memory Barrier)

DMB 란 LDR, STR 등 memory access instruction의 reordering을 방지하는 것이다.
DMB instruction이 선언된 이전의 instruction들이 reordering되지 않고 순서에 맞게 실행됨을 보장한다.

DSB(Data Synchronization Barrier)

DSBDMB 보다 조금 더 몸집이 크다고 볼 수 있다.
DMB처럼 memory barrier로서의 역할은 하지만, DMB와 다르게

  • memory access가 완료될 때까지 기다린다.
  • cache와 branch predictor 등의 동작이 완료된 때까지 기다린다.

Real-life use case

실제로 다음과 같은 상황에 적용할 수 있다.

예를 들어, DMA transfer를 제어하기 위한 structure가 다음의 구조로 존대한다고 가정해보자.

struct dma_control {
  u32 owner;
  void * data;
  u32 len;
};

DMA의 제어권한을 가지고있는 owner가 CPU일 수 있고, HARDWARE일 수도 있다.
따라서 dma_control은 shared memory이며 owner는 CPU와 H/W 중 어느 모듈이 해당 structure를 control할 수 있는지 나타낸다.

즉, data와 length를 set한 다음 owner를 set하는 순서가 보장되어야 한다.

아래의 코드를 보자.

dma->data = data;
dma->len  = length;
dmb();
dma->owner = OWNER_HARDWARE;

즉, dma의 owner가 STR되기 이전에 length가 set되어야한다.
그렇지 않으면, CPU에 의해 위의 memory access가 reorder되어 data pointer나 length가 update되지 않은 채로 잘못된 DMA가 이뤄질 수 있기 때문이다.

References

https://developer.arm.com/documentation/100941/0100/Barriers
https://developer.arm.com/documentation/dui0489/c/arm-and-thumb-instructions/miscellaneous-instructions/dmb--dsb--and-isb
https://community.arm.com/arm-community-blogs/b/architectures-and-processors-blog/posts/memory-access-ordering---an-introduction

0개의 댓글