메모리는 엄청 느리다.
기본적으로 CPU 와 컴퓨터 메모리인 RAM 은 물리적으로 떨어져 있습니다. 따라서 CPU 가 메모리에서 데이터를 읽어 오기 위해서는 꽤 많은 시간이 걸립니다. 실제로, 인텔의 i7-6700 CPU 의 경우 최소 42 사이클 정도 걸린다고 보시면 됩니다. CPU 에서 덧셈 한 번을 1 사이클에 끝낼 수 있는데, 메모리에서 데이터 오는 것을 기다리느라, 42 번 덧셈을 연산할 시간을 놓치게 되는 것입니다.
이는 CPU 입장에 굉장한 손해가 아닐 수 없습니다. 메모리에서 데이터 한 번 읽을 때 마다 42 사이클 동안 아무것도 못한다니 말입니다.
이래서 캐시가 존재하는 것
cache
1) Temporal Locality : 방금 사용한것을 또 사용할 확률이 높다는 것
2) Spatial Locality : 한번 사용한 메모리 근방에의 것들 다시 사용할 확률이 높다는 것
#include "pch.h"
#include <iostream>
#include "CorePch.h"
#include <thread>
#include <mutex>
#include "AccountManager.h"
#include "UserManager.h"
#include <chrono>
#include <future>
#include "windows.h"
using namespace std;
int32 buffer[10000][10000] = { {0,} ,};
int main()
{
{
uint64 start = GetTickCount64();
int64 sum = 0;
for (int32 i=0;i<10000;++i)
{
for (int32 j = 0; j < 10000; ++j)
{
sum += buffer[i][j];
}
}
uint64 endt = GetTickCount64();
std::cout << endt - start << std::endl;
}
{
uint64 start = GetTickCount64();
int64 sum = 0;
for (int32 i = 0; i < 10000; ++i)
{
for (int32 j = 0; j < 10000; ++j)
{
sum += buffer[j][i];
}
}
uint64 endt = GetTickCount64();
std::cout << endt - start << std::endl;
}
return 0;
}
위 코드 실행 결과를 보면 다음과 같은 시간 차이를 보인다
i, j 순서만 바꿨을뿐인데 왜 시간 차이가 이렇게 나는 것인가?
2차원 배열은 사실상 1차원 배열이다
하지만 j 칸 을 앞부분 배열 인덱스로 지정해주면 근방의 메모리가 캐쉬에 있지 않기 때문에 캐쉬 로스로 이런 성능 저하가 발생한다 => 캐쉬에 없다면 램 까지 갔다 와야 함으로 느려짐
각 코어는 자체 L1 및 L2 캐시를 가지고 있으며, 마지막 레벨인 L3 캐시는 모든 코어에 걸쳐 공유된다.
자세한 설명은 Cache (2) (https://3dmpengines.tistory.com/2194)
반응형
'운영체제 & 병렬처리 > Multithread' 카테고리의 다른 글
Cache (3) 코어와 캐시 메모리 그리고 가시성 (0) | 2022.09.12 |
---|---|
Cache (2) - 코어당 캐시메모리 (0) | 2022.09.12 |
future , async, promise, packaged_task (2) (0) | 2022.09.11 |
future , async (간략한 비동기,동기 함수 실행) (1) (0) | 2022.09.11 |
condition_variable 예제 (Produce, Consumer) (0) | 2022.09.11 |