Trước hết một truy cập bộ nhớ chính là rất tốn kém. Hiện tại CPU 2GHz (chậm nhất một lần) có 2G tick (chu kỳ) mỗi giây. Một CPU (lõi ảo ngày nay) có thể lấy giá trị từ các thanh ghi của nó một lần mỗi lần đánh dấu. Do lõi ảo bao gồm nhiều đơn vị xử lý (ALU - đơn vị logic số học, FPU, v.v.) nên nó thực sự có thể xử lý các hướng dẫn nhất định song song nếu có thể.
Truy cập bộ nhớ chính có giá khoảng 70ns đến 100ns (DDR4 nhanh hơn một chút). Lần này về cơ bản là tìm kiếm bộ đệm L1, L2 và L3 và hơn là nhấn bộ nhớ (gửi lệnh đến bộ điều khiển bộ nhớ, gửi nó đến các ngân hàng bộ nhớ), chờ phản hồi và thực hiện.
100ns có nghĩa là khoảng 200 tick. Vì vậy, về cơ bản nếu một chương trình luôn bỏ lỡ bộ nhớ cache mà mỗi bộ nhớ truy cập, CPU sẽ dành khoảng 99,5% thời gian của nó (nếu nó chỉ đọc bộ nhớ) chờ trong bộ nhớ.
Để tăng tốc mọi thứ, có bộ đệm L1, L2, L3. Họ sử dụng bộ nhớ được đặt trực tiếp trên chip và sử dụng một loại mạch bán dẫn khác để lưu trữ các bit đã cho. Điều này chiếm nhiều dung lượng hơn, tốn nhiều năng lượng hơn và tốn kém hơn bộ nhớ chính do CPU thường được sản xuất bằng công nghệ tiên tiến hơn và lỗi sản xuất trong bộ nhớ L1, L2, L3 có thể khiến CPU không có giá trị (khiếm khuyết) bộ nhớ cache L1, L2, L3 lớn làm tăng tỷ lệ lỗi làm giảm năng suất làm giảm trực tiếp ROI. Vì vậy, có một sự đánh đổi lớn khi nói đến kích thước bộ đệm có sẵn.
(hiện tại người ta tạo thêm bộ đệm L1, L2, L3 để có thể hủy kích hoạt một số phần nhất định để giảm khả năng lỗi sản xuất thực tế là các vùng bộ nhớ cache biểu hiện toàn bộ lỗi CPU).
Để đưa ra ý tưởng về thời gian (nguồn: chi phí để truy cập bộ nhớ cache và bộ nhớ )
- Bộ đệm L1: 1ns đến 2ns (2-4 chu kỳ)
- Bộ đệm L2: 3ns đến 5ns (6-10 chu kỳ)
- Bộ đệm L3: 12ns đến 20ns (24-40 chu kỳ)
- RAM: 60ns (120 chu kỳ)
Vì chúng tôi trộn các loại CPU khác nhau, đây chỉ là ước tính nhưng sẽ có ý tưởng tốt về những gì sẽ xảy ra khi giá trị bộ nhớ được tải và chúng tôi có thể bị lỗi hoặc bỏ lỡ trong lớp bộ đệm nhất định.
Vì vậy, bộ nhớ cache về cơ bản tăng tốc truy cập bộ nhớ rất nhiều (60ns so với 1ns).
Tìm nạp một giá trị, lưu trữ nó trong bộ đệm để có cơ hội đọc lại, điều đó tốt cho các biến thường được truy cập nhưng đối với các hoạt động sao chép bộ nhớ thì sẽ vẫn chậm vì người ta chỉ đọc giá trị, ghi giá trị ở đâu đó và không bao giờ đọc giá trị một lần nữa ... không có lần truy cập bộ đệm, chết chậm (bên cạnh điều này có thể xảy ra song song vì chúng tôi đã thực hiện lệnh).
Bản sao bộ nhớ này rất quan trọng đến nỗi có nhiều phương tiện khác nhau để tăng tốc nó. Trong những ngày đầu, bộ nhớ thường có thể sao chép bộ nhớ ngoài CPU. Nó được xử lý trực tiếp bởi bộ điều khiển bộ nhớ, do đó thao tác sao chép bộ nhớ không gây ô nhiễm bộ đệm.
Nhưng bên cạnh một bộ nhớ đơn giản, việc truy cập bộ nhớ nối tiếp khác khá phổ biến. Một ví dụ là phân tích một loạt thông tin. Có một mảng các số nguyên và tính tổng, trung bình, trung bình hoặc thậm chí đơn giản hơn, tìm một giá trị nhất định (bộ lọc / tìm kiếm) là một loại thuật toán rất quan trọng khác chạy mỗi lần trên bất kỳ CPU mục đích chung nào.
Vì vậy, bằng cách phân tích mẫu truy cập bộ nhớ, rõ ràng dữ liệu được đọc tuần tự rất thường xuyên. Có khả năng cao là nếu một chương trình đọc giá trị tại chỉ mục i, thì chương trình đó cũng sẽ đọc giá trị i + 1. Xác suất này cao hơn một chút so với xác suất mà cùng một chương trình cũng sẽ đọc giá trị i + 2, v.v.
Vì vậy, được cung cấp một địa chỉ bộ nhớ, đó là (và vẫn là) một ý tưởng tốt để đọc trước và lấy các giá trị bổ sung. Đây là lý do tại sao có một chế độ tăng.
Truy cập bộ nhớ trong chế độ tăng có nghĩa là một địa chỉ được gửi và nhiều giá trị được gửi tuần tự. Mỗi giá trị gửi thêm chỉ mất khoảng 10ns bổ sung (hoặc thậm chí bên dưới).
Một vấn đề khác là một địa chỉ. Gửi một địa chỉ mất thời gian. Để giải quyết một phần lớn bộ nhớ, các địa chỉ lớn phải được gửi. Trong những ngày đầu, điều đó có nghĩa là bus địa chỉ không đủ lớn để gửi địa chỉ trong một chu kỳ (đánh dấu) và cần nhiều hơn một chu kỳ để gửi địa chỉ thêm chậm trễ.
Ví dụ, một dòng bộ đệm 64 byte có nghĩa là bộ nhớ được chia thành các khối bộ nhớ riêng biệt (không chồng lấp) có kích thước 64byte. 64byte có nghĩa là địa chỉ bắt đầu của mỗi khối có sáu bit địa chỉ thấp nhất luôn luôn là số không. Vì vậy, việc gửi sáu bit 0 này mỗi lần là không cần thiết, tăng không gian địa chỉ 64 lần cho bất kỳ số lượng chiều rộng bus địa chỉ nào (hiệu ứng chào mừng).
Một vấn đề khác mà dòng bộ đệm giải quyết (bên cạnh việc đọc trước và lưu / giải phóng sáu bit trên bus địa chỉ) nằm ở cách tổ chức bộ đệm. Ví dụ: nếu một bộ đệm sẽ được chia thành các khối 8 byte (64 bit) (các ô) thì người ta cần lưu trữ địa chỉ của ô nhớ mà ô bộ đệm này giữ giá trị cùng với nó. Nếu địa chỉ cũng là 64 bit, điều này có nghĩa là một nửa kích thước bộ đệm được sử dụng bởi địa chỉ dẫn đến chi phí là 100%.
Vì một dòng bộ đệm là 64byte và CPU có thể sử dụng 64bit - 6bit = 58bit (không cần lưu trữ các bit 0 quá đúng) có nghĩa là chúng ta có thể lưu trữ 64byte hoặc 512 bit với chi phí là 58 bit (11% trên không). Trong thực tế, các địa chỉ được lưu trữ thậm chí còn nhỏ hơn thế này nhưng có thông tin trạng thái (như dòng bộ đệm hợp lệ và chính xác, bẩn và cần phải ghi lại trong ram, v.v.).
Một khía cạnh khác là chúng ta có bộ đệm kết hợp thiết lập. Không phải mọi tế bào bộ đệm đều có thể lưu trữ một địa chỉ nhất định mà chỉ là một tập hợp con của những địa chỉ đó. Điều này làm cho các bit địa chỉ được lưu trữ cần thiết thậm chí còn nhỏ hơn, cho phép truy cập song song bộ đệm (mỗi tập hợp con có thể được truy cập một lần nhưng độc lập với các tập hợp con khác).
Điều đặc biệt hơn nữa là khi đồng bộ hóa truy cập bộ nhớ cache / bộ nhớ giữa các lõi ảo khác nhau, nhiều đơn vị xử lý độc lập của chúng trên mỗi lõi và cuối cùng là nhiều bộ xử lý trên một bo mạch chính (có các bo mạch chứa tới 48 bộ xử lý trở lên).
Về cơ bản, đây là ý tưởng hiện tại tại sao chúng ta có các dòng bộ đệm. Lợi ích của việc đọc trước là rất cao và trường hợp xấu nhất là đọc một byte đơn từ dòng bộ đệm và không bao giờ đọc phần còn lại là rất mong manh vì xác suất rất mỏng.
Kích thước của dòng bộ đệm (64) là sự đánh đổi được lựa chọn khôn ngoan giữa các dòng bộ đệm lớn hơn khiến cho byte cuối cùng của nó không thể đọc được trong tương lai gần, thời lượng cần thiết để tìm nạp dòng bộ đệm hoàn chỉnh từ bộ nhớ (và để ghi lại) và cả chi phí trong tổ chức bộ đệm và sự song song của bộ nhớ cache và truy cập bộ nhớ.