캐시 지역성에 관한 의문

kimgarchi@GitHub의 이미지

캐시 적중도는
시간 지역성(얼마나 자주 쓰는가)과 공간 지역성(주변것들이 연관이 되어있는거 같은가)으로 구분됩니다.

뭐 이거는 다들 알고들 아는 사실이신데...

의문이 드는 사항은 다음과 같습니다.

컨테이너에 다량의 변수가 투입되어져 있을 경우,

1번 컨테이너 : 해당 변수들이 스택에 저장되어져 있는 컨테이너
2번 컨테이너 : 해당 변수들이 힙에 저장되어져 있는 컨테이너 (포인터 변수)

로 우선 구분을 지었었습니다.

다만 스택오버 플로때문에 변수 개별의 크기 (혹은 갯수)를 무지막지하게 늘릴수없어서,
행위 자체만을 늘려서 테스트를 수행하였습니다.

테스트의 방식은 다음과 같았습니다.

디버깅모드로 작업, 릴리즈는 단순연산을 최적화로 무마시켜버려 동작이 수행되지않아 배제하였습니다.

1번과 2번 컨테이너를 각각 미리 준비
단순 연산을 통해 작업을 수행

1번 케이스 : 객체의 크기를 크게 하고 반복 횟수를 적게함
2번 케이스 : 객체의 크기를 적게하고 반복횟수를 증가시킴

이 경우는 캐시 적중도를 생각해보면

1번 케이스의 경우
1번 컨테이너의 경우
- 변수 개개별의 사이즈가 커서 캐시메모리 구조상,
읽어들이고 쓰는데에 좀더 많은 비용이 들어 작업시간이 상대적으로 오래걸림

2번 컨테이너의 경우
- 포인터만으로 들고있어, 우선 객체 정보가 직접 복사되지않아,
읽어들이고 쓰는데에 상대적으로 시간을 적게 소모하여, 작업시간이 상대적으로 적음

2번 케이스의 경우
1번 컨테이너의 경우
- 변수 개개별의 크기가 작아서 캐시메모리 읽기 쓰기 작업 빈도가 적어짐, 작업시간이 상대적으로 적음
2번 컨테이너의 경우
- 포인터 주소에 의한 접근 동작에 의해 상대적으로 작업시간이 상대적으로 오래 걸림

으로 추측하였습니다.

그럼 여기서 포인터 주소의 목적지(힙데이터)는 캐시 메모리 방식상 히트되어 사용되어지는것인가요
아니면 L2나 혹은 그 이하의 메모리단에서 사용되는 것인지를 모르겠습니다.

일단 위의 추측에 의한 가설자체가 틀렸다면, 이 질문자체가 무의미해지는게 아닌가하기도 하네요.

해당 테스트를 해보는게 사용된 코드는 첨부파일에 있습니다.
코드라고 해봐야 정말 별볼일 없는 케이스 이지만요

뻘글 읽어주셔서 감사합니다.

File attachments: 
첨부파일 크기
Plain text icon test.txt1.24 KB
익명 사용자의 이미지

	using CLL = std::list<test_cl>;
	using PCLL = std::list<test_cl*>;
 
	CLL cll{ loop_set , test_cl()};
	PCLL pll{ loop_set, new test_cl };

cll이 1번 컨테이너, pll이 2번 컨테이너인가요?

그렇게 의도하고 작성하신 것이라면, 의도대로 작성되지 않은 겁니다. 두 컨테이너 모두 test_cl 객체를 힙에 생성합니다.[1]

다만 디테일에 조금 차이가 있는데,
1) 전자는 의도대로 loop_set개의 test_cl 인스턴스를 가진 리스트입니다.
2) 후자는 단 한 개의 test_cl 인스턴스를 가리키는 loop_set개의 포인터를 가진 리스트입니다.

그래서 후자가 오히려 힙 사용량이 더 적을 수도 있어요.

[1] 엄밀히는 전자의 경우는 default allocator의 동작이 어떻고 왱알왱알해야 하지만 귀찮으니 대충 뭉갭니다. 더 시간 많고 친절한 분이 설명해주세요.

kimgarchi@GitHub의 이미지

리스트 초기화 부분에 잘못된 사항이 있었네요

질문이 장황하고, 저도 표현을 잘못한 바가 많았던거같습니다...

다시 정리해보자면 요지는 다음과 같을거 같네요

포인터를 변수로 사용할 경우 정책이 어떻게 되는가 였던거같네요

주소만이 캐싱? 혹은 주소와 데이터 모두, 혹은 데이터만? 에 대한것이네요...

바쁜 시간 쪼개서 답변해주셔서 감사합니다..
애매 모호하였던 부분의 텍스트 파일은 수정하여 재 갱신하였습니다.

익명 사용자의 이미지

CPU 캐시는 포인터를 특별취급 하지 않습니다. 읽고 쓰는 데이터가 포인터이든 아니든 차이가 있을 이유가 없습니다.

서로 다른 추상화 수준에서 동작하기 때문입니다.

메모리에 포인터 등의 구체적인 타입을 부여하는 건 고급 언어의 영역이고, 캐시는 그보다 훨씬 낮은 수준에서 동작합니다.

라스코니의 이미지

어떤 점이 궁금하신지 애매하긴 한데 답변 글로 유추해 볼때, 우선 포인터에 대한 액세스가 캐쉬 동작에 어떤 영향을 미치는지 보면 포인터 역시 변수의 일종에 불과하기 때문에 결정적인 차이는 없습니다.

캐쉬는 정적인 성능을 보장하지도 않고 코드에 따라 효과를 체감하는 것도 어렵지만, 캐쉬의 장점을 가장 무력화하는 것은 어떤 영역의 메모리를 아주 잠깐 액세스하다가 바로 아주 먼거리에 있는 영역의 메모리를 잠깐 액세스하고,,, 이것을 계속 반복하는 것입니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.