const int N = 10'000'000;
std::vector<int> data(N, 1);
long long total_time = 0;
for (int trial = 1; trial <= 100; ++trial)
{
std::chrono::high_resolution_clock::time_point loop_start = std::chrono::high_resolution_clock::now();
for (int i = 0; i < N; ++i)
{
data[i] = data[i] * 2;
}
std::chrono::high_resolution_clock::time_point loop_end = std::chrono::high_resolution_clock::now();
long long loop_duration = std::chrono::duration_cast<std::chrono::microseconds>(loop_end - loop_start).count();
total_time += loop_duration;
std::printf("Trial %d: %lld microseconds\tPrefix sum : %lld\n", trial, loop_duration, total_time);
}
캐시 히트랑 관련해서 성능 체크 하고 있는데요.
'배열을 첫 번째로 순회하면 캐시 미스가 발생해서 캐시의 이점을 받지 못할거고, 두 번째 순회부터 캐시 히트가 발생해서 성능이 좋아질거다'가 제 가설입니다.
그런데 결과는 그렇지 않더라고요?
Trial 1: 56419 microseconds Prefix sum : 56419
Trial 2: 58292 microseconds Prefix sum : 114711
Trial 3: 58812 microseconds Prefix sum : 173523
Trial 4: 58781 microseconds Prefix sum : 232304
Trial 5: 59098 microseconds Prefix sum : 291402
Trial 6: 72381 microseconds Prefix sum : 363783
Trial 7: 74246 microseconds Prefix sum : 438029
Trial 8: 74776 microseconds Prefix sum : 512805
Trial 9: 79723 microseconds Prefix sum : 592528
Trial 10: 71451 microseconds Prefix sum : 663979
이런 결과도 나오더라고요.
이유를 모르겠습니다... 제가 실수하고 있는 부분이 있을까요?
캐싱할만한 연산이 아니여서
말씀하신게 원인이었던걸까요... [i] = [i] + [i -1] 연산으로 바꿨더니 제 가설처럼 동작합니다
어떤 메모리를 접근해야 캐시에 올린다 vs 미리 올린다
이제 예전 캐시크기 작았던 시절이랑 다를걸~ 요런 애매한거 테스트는 비추천
릴리즈빌드함?
네 릴리즈로 빌드했어요