메모리는 엄청 느리다.

기본적으로 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)

 

 

ref : https://modoocode.com/271

반응형

+ Recent posts