Công nghệ Intel smart cache.

Một phần của tài liệu Tìm hiểu kiến trúc VXL intel core i3 i5 trên nền Nehalem báo cáo chi tiết (Trang 33 - 42)

III/ Những đặc tính công nghệ mới trong dòng vi xử lí core i3, i5.

6.Công nghệ Intel smart cache.

Khi xu hướng di chuyển từ một lõi xử lý đa lõi cho những bước nhảy vọt hiệu suất tính toán tiếp theo, kiến trúc hệ thống có nhiều lựa chọn cho việc tổ chức một trong những hệ thống quan trọng nhất nguồn tài nguyên bộ nhớ cache. Một số kiến trúc lựa chọn để giữ cho bộ nhớ cache cấp tin cho mỗi lõi để đơn giản, trong khi kiến trúc khác khám phá chia sẻ bộ nhớ cache cấp cuối cùng trong số các lõi khác nhau cho tỷ lệ hiệu suất / chi phí tốt hơn và cải thiện phân

bổ nguồn lực.

Ví dụ, Intel ® Core ™ Duo là một bộ vi xử lý đầu tiên giới thiệu kiến trúc chia sẻ bộ nhớ cache vào một môi trường đa lõi với dịch vụ ® Intel Smart Cache. Tổ chức này cho phép cả hai lõi để có quyền truy cập vào toàn bộ bộ nhớ cache cấp 2MB (trong trường hợp này nó là bộ nhớ cache L2), giảm underutilization nguồn lực có thể. Các dữ liệu nâng cao tìm nạp trước cải thiện hiệu quả bằng cách tìm nạp trước dữ liệu vào bộ nhớ cache L2 ngay cả trước khi yêu cầu bộ nhớ cache xảy ra. Intel Smart Cache cũng có tính năng cơ chế tiết kiệm năng lượng mới cho phép Intel Smart Cache L2 để tự động nap cách thức của mình vào bộ nhớ hệ thống, dựa trên nhu cầu, hoặc trong thời gian không hoạt động.

Kiến trúc bộ nhớ cache chia sẻ mang lại cơ hội mới thú vị cho các nhà thiết kế phần mềm và hệ thống.

Lợi ích của kiến trúc bộ nhớ cache chia sẻ

• Hiệu quả sử dụng bộ nhớ cache

o Nếu một lõi nhàn rỗi , lõi kia có tất cả bộ nhớ cache chia sẻ

o Giảm underutilization tài nguyên

• Tính linh hoạt cho các lập trình viên

o Cho phép tạo nhiều cơ hội chia sẻ dữ liệu cho các mục đích hoạt động trên các lõi riêng biệt được chia sẻ trên bộ nhớ cache

o Một lõi có thể pre-/post-process dữ liệu cho các lõi khác

o Thay thế cơ chế thông tin liên lạc giữa các lõi

• Giảm bộ nhớ cache-sự liên lạc phức tạp

o Giảm chia sẻ sai bởi vì bộ nhớ cache chia sẻ

o Ít hơn khối lượng công việc để duy trì sự mạch lạc, so với kiến trúc bộ nhớ cache tư nhân

• Giảm lưu trữ dữ liệu dự phòng

o Cùng một dữ liệu chỉ cần phải được lưu trữ một lần

o Chia sẻ dữ liệu hiệu quả giữa các lõi cho phép các yêu cầu dữ liệu phải được giải quyết ở cấp độ chia sẻ bộ nhớ cache thay vì đi tất cả các con đường vào bộ nhớ hệ thống

Hình 1: Chung cache. Ví dụ: Một hệ thống dual-core, bộ xử lý kép

Trong trường hợp này, bộ nhớ cache chia sẻ cấp cuối cùng là bộ nhớ cache L2. Tuy nhiên, những lợi ích và kỹ thuật phần mềm được mô tả trong bài viết này áp dụng chung cho cả loại cho các hệ thống chia sẻ bộ nhớ cache. Có những thách thức để tận dụng tốt nhất của một bộ nhớ cache được chia sẻ, và nó sẽ được giải quyết trong các phần sau.

Phần mềm kỹ thuật cho các hệ thống đa lõi được chia sẻ bộ nhớ cache

Có một số kỹ thuật để sử dụng bộ nhớ cache có hiệu quả nổi tiếng. Trong bài viết này, chúng tôi sẽ tập trung vào những người đặc biệt có liên quan đến các hệ thống đa lõi với kiến trúc bộ nhớ cache chia sẻ được mô tả trong phần trước.

Processor Affinity

Trong một môi trường đa lõi, kiểm soát cốt lõi để chạy một chủ đề cụ thể hoặc ứng dụng trên là cần thiết. Nếu không có kiểm soát này, các ứng dụng chủ đề / có thể được giao cho các bộ vi xử lý hoặc lõi sai và gây ra sự xuống cấp hiệu năng không cần thiết.

Nó có thể là giá trị nó để xem xét việc tách các chủ đề tranh cãi chỉ (chủ đề không chia sẻ bất kỳ dữ liệu nào nhưng cần phải sử dụng bộ nhớ cache) từ mỗi khác, và gán cho lõi mà không phải chia sẻ bộ nhớ cache. Mặt khác, nó cũng quan trọng để xét giao chia sẻ dữ liệu chủ đề để lõi được chia sẻ bộ nhớ cache, hoặc thậm chí gán cho chúng cùng một lõi nếu chúng được gắn chặt với nhau.

Trong các hệ thống điều hành khác nhau, các chức năng để kiểm soát mối quan hệ quá trình có thể khác nhau.

Windows * Ví dụ:

/ * Thiết lập xử lý mối quan hệ * /

BOOL WINAPI SetProcessAffinityMask (Xử lý hProcess, DWORD_PTR dwProcessAffinityMask);

/ * Thiết lập chủ đề mối quan hệ * /

DWORD_PTR WINAPI SetThreadAffinityMask (Handle hThread, DWORD_PTR dwThreadAffinityMask);

Linux * Ví dụ:

/ * Nhận các mối quan hệ CPU cho một công việc * / extern int sched_getaffinity (

pid_t pid, size_t cpusetsize, cpu_set_t * cpuset);

/ * Thiết lập các mối quan hệ CPU cho một công việc * / extern int sched_setaffinity (

pid_t pid, size_t cpusetsize, const cpu_set_t * cpuset);

Bộ nhớ cache chặn (dữ liệu ốp lát)

Kỹ thuật cache chặn (còn gọi là dữ liệu ốp lát) sẽ cố gắng để cho phép dữ liệu ở bộ nhớ cache trong khi được xử lý bởi các vòng lặp dữ liệu. Bằng cách làm giảm lưu lượng truy cập bộ nhớ cache không cần thiết (lấy và trục xuất cùng một dữ liệu trong suốt vòng), một bộ nhớ cache tốc độ hit tốt hơn là đạt được.

Các ứng viên có thể cho các kỹ thuật ngăn chặn bộ nhớ cache bao gồm các bộ dữ liệu lớn mà có được hoạt động trên nhiều lần. Bằng cách thông qua các thiết lập toàn bộ dữ liệu và thực hiện một hoạt động, tiếp theo là một mật khẩu cho hoạt động thứ hai, và như vậy, nếu toàn bộ dữ liệu thiết lập không phù hợp với bộ nhớ cache, các yếu tố đầu tiên trong bộ nhớ cache sẽ bị đuổi để phù hợp với người cuối cùng các yếu tố in Sau đó, lặp đi lặp lại qua vòng lặp tiếp theo,

tải dữ liệu mới sẽ gây ra các dữ liệu cũ bị đuổi, có thể tạo ra một hiệu ứng domino, toàn bộ dữ liệu bộ cần phải được nạp cho từng vượt qua thông qua các vòng lặp. Theo các tiểu phân chia các dữ liệu lớn thành các khối nhỏ hơn và chạy tất cả các hoạt động trên mỗi khối trước khi chuyển vào khối tiếp theo, có một khả năng rằng toàn bộ khối sẽ vẫn còn trong bộ nhớ cache thông qua tất cả các hoạt động.

Bộ nhớ cache chặn đôi khi đòi hỏi thiết kế phần mềm để "suy nghĩ bên ngoài hộp" và chọn lưu lượng hoặc logic đó không phải là thực hiện rõ ràng hoặc tự nhiên nhất, nhưng là có lợi hơn cho việc sử dụng bộ nhớ cache.

Hình 2: Cải thiện tốc độ hit bộ nhớ cache với các kỹ thuật ngăn chặn bộ nhớ cache

Khối trên bên trái của hình 2 cho thấy một vòng lặp dữ liệu trên một dữ liệu lớn với kích thước lớn hơn kích thước bộ nhớ cache. Để hoàn thành các vòng lặp một lần, một số dữ liệu được nạp vào bộ nhớ cache trong đầu của vòng lặp sẽ phải được đuổi ra khỏi nhà để xử lý phần sau của dữ liệu. Đối với các phiên bản kế tiếp của vòng lặp, các dữ liệu đã bị đuổi ra khỏi nhà sớm sẽ cần phải được tái lấy vào bộ nhớ cache. Kết quả là, nó sẽ tạo ra lưu lượng truy cập nhiều hơn vào và ra của bộ nhớ cache, và giới thiệu yêu cầu bộ nhớ cache hơn bỏ sót.

Dòng chảy được hiển thị trên bên phải của hình 2 được chia thành bốn tuyến dữ liệu trên những phần nhỏ hơn của tập dữ liệu, với mỗi đoạn có kích thước nhỏ hơn so với kích thước bộ nhớ cache. Kết quả là, trong mỗi vòng lặp, đoạn nhỏ hơn có thể ở lại trong bộ nhớ cache lâu hơn, kết quả là ít lưu lượng truy cập vào và ra của bộ nhớ cache, và yêu cầu bộ nhớ cache giảm tỷ lệ bỏ lỡ. Ví dụ mô tả ở đây có lẽ là bộ nhớ cache đơn giản ngăn chặn kỹ thuật. Có chương trình bộ nhớ cache chặn tiên tiến hơn có sẵn, tùy thuộc vào bản chất của các ứng dụng và các

thuật toán.

Giữ cách tiếp cận

Cách tiếp cận giữ liên quan đến việc giảm tần suất truy cập vào các dữ liệu được chia sẻ bằng cách cho phép mỗi thread duy trì bản sao riêng của dữ liệu, chỉ cập nhật các bản sao được chia sẻ khi nó là cần thiết.

Hình 3: Giữ bản sao tư nhân và chỉ cập nhật các bản sao được chia sẻ khi cần thiết

Trong Hình 3 A, sợi 0 và thread 1 cập nhật các dữ liệu được chia sẻ sao chép thường xuyên, dẫn đến lưu lượng truy cập nhiều hơn vào và ra của bộ nhớ cache chia sẻ, trong khi trong hình 3 B, các chủ đề về xử lý kỷ luật của việc truy cập bản sao được chia sẻ bởi chỉ cập nhật khi cần thiết. Một cách để đạt được điều này là để giữ một bản sao dữ liệu cá nhân để theo dõi cho đến khi cập nhật phải được thực hiện các bản sao được chia sẻ. Một ví dụ thực tế là sử dụng các khoản giảm OpenMP * để mỗi thread giữ một bản sao tư nhân và chỉ củng cố các kết quả khi tất cả các chủ đề được hoàn thành.

Chậm tiếp cận

Cách tiếp cận chậm mất lợi thế của việc trục xuất bộ nhớ cache L1 tự nhiên bằng cách chèn một chờ đợi cho đến khi dữ liệu được đẩy vào bộ nhớ cache L2 chia sẻ trước khi yêu cầu cốt lõi khác truy cập vào nó. Khi đề hai chạy trên hai lõi được chia sẻ bộ nhớ cache L2 và các chủ đề được chia sẻ dữ liệu, nó có thể thực hiện một chương trình như vậy để tinh chỉnh hiệu suất.

Cách tiếp cận chậm mất lợi thế của việc trục xuất bộ nhớ cache L1 tự nhiên bằng cách chèn một chờ đợi cho đến khi dữ liệu được đẩy vào bộ nhớ cache L2 chia sẻ trước khi yêu cầu cốt lõi khác truy cập vào nó. Khi đề hai chạy trên hai lõi được chia sẻ bộ nhớ cache L2 và các chủ đề được chia sẻ dữ liệu, nó có thể thực hiện một chương trình như vậy để tinh chỉnh hiệu suất.

Hình 4: Khái niệm dòng chảy của cách tiếp cận chậm

Thể hiện trong hình 4 là một thiết kế sử dụng bộ nhớ cache L2 chia sẻ để thực hiện một dữ liệu đơn giản chia sẻ giữa các chủ đề 0 trên lõi 0, và thread 1 trên lõi 1. Hoạt động chi tiết cho Hình 4 là:

• Bước 1 và 2: thread 0 lấy dữ liệu vào bộ nhớ cache L1 và sửa đổi nó

• Bước 3: Chủ đề 0 gửi một tín hiệu đến thread 1 để cho nó các dữ liệu đã sẵn sàng

• Bước 4: thread 1 kiểm tra nếu dữ liệu trong bộ nhớ cache L2, được một bỏ lỡ

• Bước 5: dữ liệu được đuổi ra khỏi nhà vào L2 cache

• Bước 6: thread 1 nhận dữ liệu

Bằng cách giới thiệu một sự chậm trễ trong hình 4 B, một phần của dữ liệu được xử lý by thread 0 có thể đã bị đuổi ra vào bộ nhớ cache L2. Kết quả là, bộ nhớ cache hit tỷ lệ tổng thể có thể được cải thiện. Hoạt động chi tiết cho 4 Hình B là:

• Bước 3: thay vì gửi một tín hiệu ngay lập tức, chủ đề 0 chờ đợi cho đến khi một phần của dữ liệu xử lý bị đuổi ra khỏi nhà vào bộ nhớ cache L2. Số tiền chậm trễ cần thiết được xác định bởi L1 sử dụng bộ nhớ cache và kích thước dữ liệu

• Bước 4: Chủ đề 0 gửi một tín hiệu đến thread 1 để xử lý

• Bước 5: thread 1 yêu cầu dữ liệu

• Bước 6: ít nhất một phần của dữ liệu đã có trong bộ nhớ cache L2, mà kết quả trong một tỷ lệ nhấn L2

Trong thực tế, môi trường là nhiễu và có thể có cử nhiều cho các cache. Nó có thể là khó khăn để có được một kiểm soát sắc nét của sự chậm trễ cần thiết. Ue techniq này được khuyến khích cho các ứng dụng để thiết kế có quyền kiểm soát trên những gì các chủ đề đang chạy, và được sử dụng để tinh chỉnh các ứng dụng và bóp ra một số chu kỳ có thể.

Tránh dùng chung sai

False chia sẻ là một vấn đề nổi tiếng trong các môi trường đa. Nó xảy ra khi các chủ đề trên các bộ xử lý khác nhau viết một dòng bộ nhớ cache chia sẻ, nhưng không phải ở cùng một vị trí. Kể từ bộ vi xử lý viết đến các địa điểm khác nhau, không có vấn đề sự liên lạc thực, tuy nhiên, giao thức bộ nhớ cache-sự liên lạc đánh dấu dòng bộ nhớ cache bẩn, và khi vị trí khác sẽ có được một đọc / viết yêu cầu logic phần cứng sẽ buộc một tải lại của một dòng bộ nhớ cache cập nhật từ bộ nhớ. Cập nhật thường xuyên các dữ liệu trong dòng chia sẻ bộ nhớ cache có thể gây ra hiệu năng suy thoái nghiêm trọng. Kết quả là, chia sẻ sai lầm nên tránh, đặc biệt là ở các khu vực chế biến cao.

Mặc dù kiến trúc chia sẻ bộ nhớ cache đã giảm cache-sự mạch lạc các vấn đề ở cấp bộ nhớ cache chia sẻ, hệ thống đa lõi tổng thể vẫn có thể có các vấn đề chia sẻ sai. Ví dụ, để duy trì sự mạch lạc bộ nhớ cache trong bộ nhớ cache L1 tư nhân, chia sẻ sai lầm có thể xảy ra. Như minh họa trong hình 5, thread 0 trong lõi 0 mang đến một dòng bộ nhớ cache L1 và thay đổi một phần của nó. Chủ đề 1 trong lõi 1 muốn để sửa đổi một phần khác nhau của cùng một dòng bộ nhớ cache, cũng. Logic sự liên lạc phần cứng phát hiện rằng các dòng bộ nhớ cache đã được sửa đổi bởi lõi 0. Kết quả là, bộ nhớ cache L1 dòng từ lõi 0 phải bị đuổi đến bộ đệm L2, và sau đó nạp vào bộ nhớ cache L1 lõi 1 trước khi cập nhật có thể được hoàn thành.

Hình 5: chia sẻ False

Hơn nữa, trong các hệ thống đa xử, có thể là sai lầm chia sẻ giữa các lõi mà không phải chia sẻ bộ nhớ cache. Ví dụ, trong hình 1, chủ đề đang chạy trên lõi 0 có thể sẽ chạy vào các vấn đề chia sẻ sai với chủ đề đang chạy trên core 2.

Mẹo để sửa chữa chia sẻ sai

Một trong những kỹ thuật phổ biến nhất để giải quyết các vấn đề chia sẻ giả là để cấp phát không chia sẻ dữ liệu với các dòng bộ nhớ cache khác nhau. Kỹ thuật khác là để sao chép các biến toàn cầu để biến chức năng địa phương, sau đó copy dữ liệu trở lại trước khi thoát khỏi chức năng. Trong nhóm, quá trình cấu trúc dữ liệu với nhau và giữ cho kích thước của các yếu tố dữ liệu hoặc ngay dưới một bội số của kích thước cache-line, để tránh lãng phí tài nguyên bộ nhớ cache quá nhiều. Một mẹo để sửa chữa sai chia sẻ là để xem xét việc di chuyển chủ đề để cùng một lõi.

Cache L3 xuất hiện trong vi xử lí core i thế hệ thứ nhất - kiến trúc Nehalem:

Hệ thống bộ nhớ đệm (cache) chính là một trong những thay đổi mạnh mẽ nhất trong kiến trúc Nehalem so với kiến trúc “tiền bối” Core. Trong Core, bộ nhớ đệm (cache) cao nhất mà một BXL có là dung lượng cache L2 được đem chia sẻ giữa hai nhân. Dung lượng cache L2 trong những dòng vi xử lý 45nm gần nhất có thể lên đến 6MB, có 24 đường liên kết và độ trễ là 14 hay 15 chu kỳ. Trong khi đó, hệ thống cache trong Nehalem được tăng thêm một mức cache L3 có dung lượng lớn (8MB) và dùng chung cho tất cả các nhân. Mỗi nhân còn sở hữu riêng hai cache L1 (64KB) và L2 (256KB, độ trễ thấp hơn 12 chu kỳ và có 8 đường liên kết).

Bộ nhớ đệm L3 trong các BXL nền Nehalem hoạt động với tần số độc lập và có hệ thống cấp nguồn riêng biệt với các nhân để đảm bảo độ ổn định và giảm xác suất lỗi.Ưu điểm của thiết

Một phần của tài liệu Tìm hiểu kiến trúc VXL intel core i3 i5 trên nền Nehalem báo cáo chi tiết (Trang 33 - 42)