ARM Architecture의 DMB, DSB, ISB
에 대해 설명한다.
DMB와 DSB에 대해 설명하기 전에, ARM architecture에서는 여러가지 이유로 instruction의 순서가 뒤바낄 수 있다.
옛날옛적에는 컴퓨터 프로그램은 소스코드에 쓰여진 코드 순서 그대로 동작했었다. (이를 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가 없는 LDR
과 STR
의 순서를 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
란 LDR, STR 등 memory access instruction의 reordering을 방지하는 것이다.
DMB
instruction이 선언된 이전의 instruction들이 reordering되지 않고 순서에 맞게 실행됨을 보장한다.
DSB
란 DMB
보다 조금 더 몸집이 크다고 볼 수 있다.
DMB처럼 memory barrier로서의 역할은 하지만, DMB와 다르게
실제로 다음과 같은 상황에 적용할 수 있다.
예를 들어, 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가 이뤄질 수 있기 때문이다.
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