____cacheline_aligned가 뭘뜻하는건지..

rokmn3309의 이미지

irq.h파일을 보면은.

typedef struct {
	unsigned int status;		/* IRQ status */
	hw_irq_controller *handler;
	struct irqaction *action;	/* IRQ action list */
	unsigned int depth;		/* nested irq disables */
	spinlock_t lock;
} ____cacheline_aligned irq_desc_t;

여기에서.. ____cacheline_aligned가 정확히 어떤걸 하는지..
리플 부탁드립니다.
hey의 이미지

rokmn3309 wrote:
irq.h파일을 보면은.
typedef struct {
	unsigned int status;		/* IRQ status */
	hw_irq_controller *handler;
	struct irqaction *action;	/* IRQ action list */
	unsigned int depth;		/* nested irq disables */
	spinlock_t lock;
} ____cacheline_aligned irq_desc_t;

여기에서.. ____cacheline_aligned가 정확히 어떤걸 하는지..
리플 부탁드립니다.

struct {} 구문을 ____cacheline_aligned 으로 typedef하는 겁니다.
말 그대로 타입의 이름일 뿐입니다.


----------------------------
May the F/OSS be with you..


rokmn3309의 이미지

____cacheline_aligned 이게 뭐하는건지를 알고 싶은건데..

kyong의 이미지

rokmn3309 wrote:
____cacheline_aligned 이게 뭐하는건지를 알고 싶은건데..

__attribute__((__aligned__(SMP_CACHE_BYTES)))

따라 가면 위와 같이 나올 것입니다.
compiler가 L1 cache 크기에 맞게 위 struct의 element를 align 시킬 것입니다.
예상되는 효과는 성능향상입니다.

김성진의 이미지

L1인가요?
L1은 크기도 작고, 워낙 튜닝하기 어려워서, 보통
L2에 맞추어서 코딩하는 걸로 알고 있었는데요..
뭐..아닐 수도 있지만요.

그리고, gcc에서 이런 키워드로 캐쉬라인을 맞춰준다는 기능이
있다는걸 첨 알았습니다. 고맙습니다.

그리고, 질문하신분께서 캐쉬라인에 대해 궁금해하시는 것 같아
저도 짧은 지식이지만 설명하고자 합니다.

CPU와 버스 간의 데이터 교환에 드는 비용이 싸지 않기 때문에
중간에 캐쉬라는 임시데이터 버퍼를 만들어서 말 그대로
캐슁을 합니다.

그런데, 모든 메모리 바이트 단위로 캐슁을 하는 것은 불가능할
뿐만 아니라, 계산비용이 많이 들기 때문에
일정한 크기의 단위(32, 64)의 바이트로 메모리 공간을
캐쉬 메모리로 사상시킵니다. 즉, 임의의 메모리 공간은
반드시 캐쉬 메모리의 일부분에 사상이 되고,
이런 구조로 인해 하나의 캐쉬라인(32,64 바이트짜리)은
2개 이상의 메모리 공간과 대응됩니다.

이런 이유로 CPU에서 특정 메모리에 대한 접근이 요구될 때
버스를 통해 실제 메모리까지 데이터를 요구하고, 받는 과정 대신
직접 캐쉬에 있는 이전에 저장된 메모리를 접근함으로써
성능향상을 꾀하는 것입니다.

문제는 cache miss라고 하는 현상이 발생하여,
캐쉬의 성능을 떨어뜨리는 것인데,
다양한 이유로 인해
(compulsory miss, conflict miss) 캐쉬를 사용할 수없는
경우가 발생합니다.

따라서, 가능한한 이러한 miss를 줄이고자 코딩 단계부터
신경을 쓰게 되는데 이때 사용하는 키워드가 앞에서
말씀하는 ____cacheline_aligned라는 것이네요.

특정 구조체가 캐쉬라인에 걸쳐서 메모리에
존재하는 경우에 만일 해당 구조체에 modify 연산이
이루어질 경우에는 두개 이상의 캐쉬라인이 invalidation이 되고,
이전에 존재하던 다른 응용프로그램의 캐쉬값을 overwrite하게
되는 것이죠.
따라서, 하나의 구조체가 다수의 캐쉬라인에 걸쳐 존재하면,
확률적으로 이후에 접근하는 응용프로그램은
직접 버스로부터 데이터를 가져와야 할 가능성이 높아진다고
말할 수 있습니다.

어떻게 보면, 이런 부분까지 고려해서 코딩을 해야 하나 하는
생각도 들지만,
의외로 리눅스 커널에 보면 이런 내용들이
상당히 많이 나오고, 프로그래머끼리 이런식으로 코딩하면
캐쉬를 더 효율적으로 사용할 수 있다는 메시지를
간간히 접할 수 있습니다.

최근 논문에도 보면, 캐쉬를 이용한 내용들이 많이 나오고 있으며,
99년인가 2000년인가요..그때
" Where does the time go?"라는 혁명적인
논문이 나와서 이러한 캐쉬에 대한 관심을 증폭시킨 계기가
되었습니다. (제목이 정확한지...-_-;;)

도움이 되셨기를 바랍니다.

김성진 드림

PS) 위 논문에 의하면 최신 컴퓨터 아키텍쳐 상에서
엄청나게 많은 시간이 cache miss로 인해 낭비되고 있다는
이야기를 하고 있습니다만... 쉽지 않은 화두임에는 틀림없습니다.

고도의 추상화, 극도의 구체화, 에디슨을 그리워하다.

pynoos의 이미지

김성진 wrote:
최근 논문에도 보면, 캐쉬를 이용한 내용들이 많이 나오고 있으며,
99년인가 2000년인가요..그때
" Where does the time go?"라는 혁명적인
논문이 나와서 이러한 캐쉬에 대한 관심을 증폭시킨 계기가
되었습니다.

혹시 그 논문 pdf 같은걸로 가지고 계신가요? 찾아보려니.. 유료 download 밖엔 없는 것 같아서... ^^

kyong의 이미지

pynoos wrote:
김성진 wrote:
최근 논문에도 보면, 캐쉬를 이용한 내용들이 많이 나오고 있으며,
99년인가 2000년인가요..그때
" Where does the time go?"라는 혁명적인
논문이 나와서 이러한 캐쉬에 대한 관심을 증폭시킨 계기가
되었습니다.

혹시 그 논문 pdf 같은걸로 가지고 계신가요? 찾아보려니.. 유료 download 밖엔 없는 것 같아서... ^^


http://www.informatik.uni-trier.de/~ley/db/conf/vldb/AilamakiDHW99.html
익명 사용자의 이미지

답변드립니다 ^^

cache_aligned 라는 것은 메모리에 변수할당시 (대부분 구조체배열)
각 cpu 에 해당되는 cacheline 사이즈에 맞춰서 메모리를 할당하는 방법입니다
intel 의 x86 cpu 는 대부분 64~128 bytes 이고요...

이로 인해서 얻는 이득은 cache memory 의 유효성 보장입니다

이게 무슨말이냐면... 동일한 cacheline (64bytes) 안에 변수 a 와 변수 b가 있습니다.

cpu1 이 변수 a 에 access 중입니다. 근데 cpu2 가 변수 b를 write 합니다.
이 때 변수b 가 포함된 cache line (같은 메모리line. 즉 64bytes)의 데이타는 다른 모든 cpu 의 cache memory 에서 삭제됩니다
해당 cacheline 의 데이타가 변경되었으니까요

즉 데이타의 변경은 cacheline 별로 관리가 되고 있고,
cache memory hit 가 속도에 상당히 중요한 역활을 하는 만큼
cache memory hit 율을 높히기 위하여, cacheline 크기에 맞춰 메모리를 할당하는 것 입니다

즉 size 20 의 구조체배열을 할당한다고 하였을때
cacheline 이 64 bytes 인 cpu 를 가진 장비에서 cacheline_aligned 를 사용하여 구조체배열을 할당한다고 하면
실제 메모리에는 각 구조체별로 64 bytes 씩 메모리가 할당됩니다. (20 bytes 는 데이타를 쓰고 44 bytes 는 비겠죠 ㅎㅎ)

이유비의 이미지

친절한 글 감사합니다. 이해가 잘되었습니다 ^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.