티스토리 뷰

안녕하세요, IT디자이너입니다. 

 

이번에는 구조체의 멤버변수와 캐시라인 무효화에 관하여 포스팅하도록 하겠습니다. 

 

 

우리가 어떤 구조체를 선언하여 멤버변수를 수정하고 사용하는 것을 예로 들어보겠습니다.

 

#include <iostream>


struct Data {

    char a;
    int b;

};

int main()
{
    Data da = { 1,2 };
    
    int b = 10;
    
    da.a += da.b;
    
    printf_s("%d",da.b); 
}

 

 

이렇게 쓰기와 읽기를 반복하는 과정으로 보았을 때 해당 멤버변수는 캐시에 있을 확률이 높습니다.

 

 

하지만 L1 캐시는 cpu의 1개의 코어당 1개씩 할당되어있습니다. 

만약에 2개의 코어에 한개의 멤버변수가 각각 할당되어 있고, 1개의 코어에서 해당 멤버변수에 쓰기를 하였을 때

다른 코어에서는 그것을 알 수 없습니다. 즉, 데이터 쓰기를 하기 전의 상태입니다.

 

그렇기 때문에 쓰기를 하지 않는 캐시라인을 지워버려야 합니다.

 

이것을 "캐시 무효화"라고 합니다. 하지만!!!  만약에 그 캐시라인에 다른 사용해야 할 다른 데이터가 있으면 번거롭게   

지우고 다시 캐시하는 과정을 거쳐야 합니다. 

 

이것을 막기위 우리는 해당 멤버변수를 64byte에 경계에서 할당될 수 있도록 정의할 수 있습니다.

 

만약 int b가 쓰기로 인하여 데이터 변경이 자주 발생하는 멤버변수일 경우 위의 사진처럼 __declspec(align(64)) int b;의 형태로 선언하면 됩니다.

 

그 이유는 해당 멤버변수가 64byte 경계의 설 수 있음으로서, 64byte크기인 캐시라인을 다 차지하며, 해당 캐시라인에 다른 데이터가 캐시되는 것을 방지할 수 있습니다. 

 


캐시라인을 잘 활용하고 캐시hit율을 높일 수록 좋은 성능의 프로그램이 완성됩니다.!!!!

 

이상 IT디자이너였습니다. 

 

감사합니다. 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함