Bài viết tập trung tìm hiểu và phân tích quá trình phân cấp này nhằm lý giải phần nào về sự cải thiện rõ rệt về mặt tốc độ xử lý của CMP. Mặt khác, hiệu suất của CMP chỉ đạt tối ưu khi sự phân cấp bộ nhớ là phù hợp với chương trình ứng dụng thực tế. Trong nghiên cứu này, chúng tôi trình bày mối liên hệ giữa cấu trúc bộ nhớ thứ bậc của chip CMP và những đặc tính chính của một chương trình ứng dụng chạy trên nó. Mời các bạn cùng tham khảo!
Trang 1Nghiên cứu và thiết kế chip xử lý đa nhân sử dụng
Multi2Sim
Email : {vinh.ngoquang, hao.doduc}@icdrec.edu.vn Email: {hoangtrang, vdthanh}@hcmut.edu.vn
Tóm tắt nội dung—Chip đa nhân (CMP) ngày càng được
sử dụng rộng rãi nhờ vào năng lực tính toán được nâng
cao rõ rệt so với các thế hệ chip một nhân Tốc độ cũng
như hiệu quả của CMP chủ yếu đến từ quá trình phân
cấp bộ nhớ Tùy vào cách thiết kế mà các thành phần bộ
nhớ cùng nhau chia sẻ dữ liệu hay sử dụng một cách độc
quyền Điều đó làm cho khả năng lưu trữ của bộ nhớ vô
cùng linh hoạt và qua đó trực tiếp cải thiện tốc độ xử
lý Chúng tôi tập trung tìm hiểu và phân tích quá trình
phân cấp này nhằm lý giải phần nào về sự cải thiện rõ
rệt về mặt tốc độ xử lý của CMP Mặt khác, hiệu suất
của CMP chỉ đạt tối ưu khi sự phân cấp bộ nhớ là phù
hợp với chương trình ứng dụng thực tế Trong nghiên cứu
này, chúng tôi trình bày mối liên hệ giữa cấu trúc bộ nhớ
thứ bậc của chip CMP và những đặc tính chính của một
chương trình ứng dụng chạy trên nó Chúng tôi sử dụng
công cụ Multi2Sim để thiết kế và chạy mô phỏng CMP Bên
cạnh đó, chương trình ứng dụng được chon là benchmark
Splash-2, là benchmark được dùng phổ biến để ước lượng
hiệu suất của thiết kế CMP Kết quả thí nghiệm cho thấy
Splash-2 đạt được hiệu suất cao nhất khi dung lượng L1
là 64 KB.
Từ khóa—Phân cấp bộ nhớ, vi xử lý đa nhân, bộ nhớ
cache, Multi2Sim
I GIỚI THIỆU Ngày nay, khi mà máy tính càng ngày càng phổ biến
và tham gia vào nhiều mặt của cuộc sống con người, yêu
cầu về năng lực xử lý của một bộ vi xử lý dường như
là một điều tất yếu Kể từ năm 2001, khi IBM lần đầu
tiên giới thiệu chip đa nhân (CMP) ra thị trường, loại
chip này đã dần thống trị thị trường vi xử lý [?] Những
thế hệ chip một nhân vào hàng xa xỉ của vài chục năm
trước thì ngày nay vẫn không thể đáp ứng được nhu cầu
của một người dùng bình thường Cho dù được cải tiến
bằng cách tăng mật độ transitor hay tăng xung nhịp, các
loại chip này vẫn không thể chạy những phần mềm ứng
dụng, những trò chơi điện tử có đồ họa cao cấp một cách
mượt mà [?][?] Chip CMP ngoài khả năng xử lý mạnh
mẽ còn có độ bền cao, hoạt động ổn định và ít bị nóng
nhờ khả năng tản nhiệt tốt [?][?] Chính những lý do
đó đã làm cho CMP ngày càng phổ biến trên thị trường cũng như không ngừng được nghiên cứu, cải tiến nhằm nâng cao chất lượng
Để nhanh chóng và dễ dàng trong việc tìm hiểu, nghiên cứu cũng như thiết kế CMP thì một phần mềm
mô phỏng là không thể thiếu Phần mềm này sẽ giúp chúng ta thiết kế một CMP dễ dàng, mô phỏng về hiệu năng tính toán, từ đó so sánh các thiết kế khác nhau nhằm rút ra ưu nhược điểm của từng thiết kế Có rất nhiều phần mềm dạng này, trong đó đa phần là miễn phí như : Gem5, Multi2Sim, SimpleScalar [?][?][?],
Trải qua một quá trình tìm hiểu và sử dụng hầu hết các chương trình trên, chúng tôi nhận thấy Multi2Sim là một công cụ rất tốt để tìm hiểu và nghiên cứu về CMP cho nhiều đối tượng, từ người mới bắt đầu đến các chuyên gia
Bên cạnh đó, Multi2Sim cũng hỗ trợ các chương trình benchmark phổ biến nhất hiện nay cho chip CMP là Splash-2 và Parsec [?][?][1] Thông qua thực hiện thí
nghiệm trên những chương trình benchmark chuẩn này, chúng tôi phân tích và rút ra một số đặc tính chính của benchmark và từ đó đưa ra các thông số thiết kế bộ nhớ
có thứ bậc phù hợp nhằm tạo ra mô hình tối ưu nhất cho benchmark đó Trong nghiên cứu, này chúng tôi chọn sử dụng Splash-2 vì nó đã được phát triển khá lâu và có độ
ổn định cao [?] Splash-2 bao gồm nhiều bài toán ứng
dụng khác nhau về tính toán hiệu năng cao và về đồ hoạ Đặc biệt, Splash-2 là benchmark được thiết kế để đánh giá các kiến trúc xử lý song song đa luồng hoặc đa nhân [1][?].
Kết quả thí nghiệm cho thấy benchmark Splash-2 có
sự phân bổ các tác vụ vào các nhân một cách cân bằng thể hiện ở tỷ lệ số lượng truy xuất bộ nhớ cache và thể hiện ở tỷ lệ hit giữa các nhân Tỷ lệ hit ở cache đạt được mức trung bình cao nhất lên tới 99.3% tương ứng với dung lượng L1 và L2 tương ứng là 64 KB và 512 KB Trong phần II, chúng tôi trình bày về kiến trúc tổ chức bộ nhớ có phân cấp của một chip xử lý đa nhân Phần giới thiệu về Multi2Sim được trình bày ở mục III Trong phần này, chúng tôi đi sâu vào những phần liên
Trang 2quan đến phần phân cấp bộ nhớ để minh họa một cách
trực quan cho nội dung của phần trước Phần IV giới
thiệu một quá trình xuyên suốt của việc thiết kế CMP,
từ khâu hình thành ý tưởng, triển khai, cấu hình, chạy mô
phỏng cho đến khâu thống kê và đánh giá Cuối cùng,
phần V là những nhận định và đánh giá của chúng tôi
về Multi2Sim đối với việc nghiên cứu và thiết kế chip
vi xử lý đa nhân
II PHÂN CẤP BỘ NHỚ TRÊNCMP
Như đã trình bày trong phần I, một CMP xét về bản
chất là sự ghép nối của nhiều chip một nhân tạo thành
Tương tự như chip một nhân, CMP khi vận hành cũng
nhận mã lệnh (Inst) và dữ liệu (Data) từ bộ nhớ để tiến
hành xử lý Các nhân trong chip gần như không thể cải
tiến gì thêm, mật độ các đơn vị xử lý gần như đã bão
hòa Mặt khác việc nâng cao hiệu năng hoạt động của
nhân thông qua việc tăng tần số hoạt động đã gặp giới
hạn rõ ràng là công suất tiêu thu của chip và mức toả
nhiệt cao [?].
Do đó, mọi sự thay đổi hay tác động lên chip với
mong muốn cải thiện hiệu năng đều được thực hiên tại
các thành phần bộ nhớ, từ kiến trúc cho đến mạng nội
bộ giữa chúng với nhau
A Phân cấp bộ nhớ
Chip và bộ nhớ chính của máy tính là hai bộ phận
riêng biệt, tách rời nhau và được liên kết với nhau bởi
một mạng nội bộ [?] Rõ ràng, khi chip yêu cầu một
Inst hay Data thì không thể có ngay được, phải chờ tín
hiệu yêu cầu đi từ chip đến bộ nhớ chính, rồi thông tin
cần thiết sẽ đi từ bộ nhớ chính về lại chip Nếu bộ nhớ
càng gần chip thì quãng đường đi lại càng ngắn, thời
gian thực thi càng ít, và ngược lại Nhưng mặc khác,
chip được cấu thành từ các mạch bán dẫn cực nhỏ, và
phải được nuôi bởi những nguồn điện tương ứng và thật
sự ổn định Nếu ta thiết kế một bộ nhớ chính với dung
lượng lớn đặt ngay bên trong chip hay quá gần chip đều
có thể làm hư hỏng chip, thậm chí gây cháy nổ Qua
đó, chúng ta nhận thấy rằng, khoảng cách từ bộ nhớ đến
chip tỉ lệ thuận với thời gian truy xuất thông tin và tỉ
lệ nghịch với dung lượng bộ nhớ Bộ nhớ càng gần chip
thì truy xuất càng nhanh nhưng dung lượng sẽ giảm đi,
và ngược lại, những bộ nhớ với dung lượng lưu trữ lớn
phải được đặt xa chip [?] Hình 1 cho ta một cái nhìn
trực quan về phân cấp bộ nhớ
Nhưng những nhu cầu ứng dụng của người dùng cuối
thường rất ngặt nghèo: phần mềm ứng dụng lớn, nhưng
yêu cầu xử lý phải nhanh Đó là thách thức, nhưng cũng
là động lực để bộ nhớ máy tính được phát triển đến một
mức độ cao hơn: phân cấp bộ nhớ [2][?][?] Quá trình
Hình 1: Phân cấp bộ nhớ
này, thực chất là sự kết hợp giữa các ưu điểm của các cách bố trí bộ nhớ: bộ nhớ chính, dung lượng lớn sẽ chứa toàn bộ nội dung chương trình, và dĩ nhiên nằm xa chip; một bộ nhớ nhỏ hơn nhiều, được thiết kế nằm trong chip, có nhiệm vụ lưu trữ những Inst và Data thường dùng nhất, nhằm tiết kiệm thời gian truy xuất đến bộ nhớ chính, bộ nhớ như vậy được biết đến với tên gọi
bộ nhớ truy cập nhanh hay bộ nhớ đêm (cache) [?] Sự
khác nhau giữa cache trong chip đơn nhân và CMP được trình bày rõ hơn trong hai mục II-A1 và II-A2
1) Cache của chip một nhân: Như đã trình bày, bộ
nhớ được đặt càng gần chip thì truy xuất càng nhanh, dung lượng phải càng nhỏ Người ta thường chia cache thành các mức : L1, L2, L3, L1 là cache nhỏ nhất,
có tốc độ truy xuất nhanh nhất, L2 có sức chứa lớn hơn L1 và truy xuất chậm hơn L1, tương tự cho các mức cao hơn [2][?] Chip một nhân chỉ có một bộ nhớ cache cho
mỗi mức, và do đó, mạng nội bộ nối từ chip, qua các mức cache, đến bộ nhớ chính rất đơn giản, đó chỉ là một đường thẳng
2) Cache của CMP: CMP là nhiều nhân hợp lại mà
thành Mỗi nhân đều có cache riêng, tùy theo cách chúng
ta bố trí mà có được các kiến trúc khác nhau Thông thường, mỗi nhân đều có cache L1 riêng, còn ở các mức cao hơn thì có thể dùng chung hoặc riêng đều được Vì
ở cùng một mức cache, có nhiều module nên chúng ta
có thể cấu hình để thu được các đồ hình (topology) khác nhau, qua đó thời gian truy xuất và hiệu năng tính toán cũng khác nhau Giả sử CMP có 4 module L2, chúng ta
có thể cho chúng nối thẳng đến L3, hoặc cho chúng nối thành một vòng (ring network), rồi nối một nút trên vòng đến L3, hoặc nối chúng thành hình sao (star network), rồi nối đến L3 Qua đó, chúng ta có thể nhận thấy rằng phân cấp bộ nhớ của CMP phức tạp và đa dạng hơn nhiều so với chip một nhân [?][?] Khi số khả năng
Trang 3phân cấp càng lớn, chúng ta càng có quyền hi vọng một
trong số chúng sẽ đem lại hiệu quả tính toán mong muốn
cho chúng ta
B Những thành phần chính của bộ nhớ Cache
Cache là một tập hợp các cache line [?] Cache line
là đơn vị cơ bản của cache, mỗi cache line chứa thông
tin đang được lưu trữ tại một địa chỉ nào đó trong bộ
nhớ Tùy theo các cách ánh xạ địa chỉ bộ nhớ lên cache
line mà ta có các kiểu cache khác nhau [3] [4] Hình 2
cho ta một minh họa trực quan
(a) Ánh xạ trực tiếp (b) ánh xạ 2-way (c) Hỗ trợ toàn phần
Hình 2: Các kiểu ánh xạ địa chỉ từ bộ nhớ vào cache
Trong hình 2a, mỗi địa chỉ trong bộ nhớ chỉ có thể
được chứa trong duy nhất một cache line Điều này sẽ
rất thuận lợi khi truy xuất vì cache line chứa địa chỉ cần
tìm, nếu có, là duy nhất Tuy nhiên, khi có nhiều địa
chỉ đáng lẽ ra được lưu trong cùng một cache line được
sử dụng thì chỉ có tối đa một địa chỉ được lưu lại trong
cache, điều này làm giảm hiệu quả của cache Để hạn
chế điều này, một giải pháp được đề nghị trong hình 2c,
mỗi địa chỉ có thể được lưu trong bất kỳ cache line nào,
miễn là cache line đó đang trống Điều này rất thuận
lợi trong lưu trữ nhưng lại tốn thời gian trong khâu tìm
kiếm Vì không biết địa chỉ mà CPU yêu cầu cầu đã có
trong cache hay chưa, nên ta phải duyệt toàn bộ cache
line để có câu trả lợi Qua đó, ta nhận thấy khả năng lưu
trữ và tốc độ truy xuất, một lần nữa, lại tỉ lệ nghịch với
nhau
Một giải pháp vừa đảm bảo tốc độ truy xuất và khả
năng lưu trữ được minh họa trong hình 2b Bộ nhớ cache
được chia làm đôi, khi đó, mỗi địa chỉ trong cache có
thể được chứa trong 2 cache line Ở một khía cạnh nào
đó, ta có thể nói điều này làm tăng sức chứa lên gấp đôi
so với trường hợp ánh xạ trực tiếp và giảm thời gian đi
một nửa khi so với trường hợp hỗ trợ toàn phần Tổng
quát, ta có thể chia cache thành k phần, mỗi phần chứa
m cache line Khi đó, ta gọi tập hợp m cache line trong
một phần là một way, nói cách khác, chúng ta có k way
Một địa chỉ trong bộ nhớ có thể thuộc vào một cache line
nào đó trong một way bất kỳ, chúng ta gọi một tập hợp
các khả năng như vậy là một cache set Do đó, chúng
ta có m cache set, bằng đúng số cache line trong một
way Khi muốn kiểm tra xem một địa chỉ đã có trong cache hay chưa, chúng ta chỉ cần tìm trong set tương ứng Đây cũng là cách tổ chức phổ biến nhất hiện nay bởi các hãng lơn như Intel hay AMD, trong đó k thường nhận giá trị 4 hoặc 8, nghĩa là tổ chức theo kiểu 4-way hoặc 8-way
Trong cache được tổ chức theo kiểu k-way, tuy kích thước của một set là không nhỏ, nhưng không chắc chứa
đủ tất cả các dữ liệu cần thiết cho CPU tại một khoảng thời gian xác định Một vấn đề rất tự nhiên nảy sinh, khi set đã chứa đầy dữ liệu nhưng chúng ta cần lưu thêm một địa chỉ nữa, vậy cần loại bỏ địa chỉ nào hiện tại Có rất nhiều chiến lược thay thế được dùng trong thực tế như: chọn ngẫu nhiên một địa chỉ để loại ra, dành chỗ cho địa chỉ mới; chọn địa chỉ có số lần sử dụng ít nhất để loại ra; First In First Out (FIFO) [?][?]; hay chọn địa chỉ ít
sử dụng nhất trong thời gian gần đây để loại bỏ (LRU) [?][?] Mỗi chiến lược đều có ưu điểm riêng, không
chiến lược nào là tốt toàn diện, và đây cũng chỉ là theo
dự đoán, không ai dám chắc địa chỉ vừa loại bỏ có được
sử dụng trong tương lai gần hay không Tuy nhiên, theo khảo sát của chúng tôi, chiến lược LRU được sử dụng khá phổ biến Đặc biệt là trong cache L2, ở đó dữ liệu Instr và data được lưu trữ chung Theo hoạt động căn bản nhất của vi xử lý thì CPU đọc Instr vào và có xu hướng không đọc hay ghi lên địa chỉ đó nữa mà có xu hướng đọc hoặc ghi lên các địa chỉ data Khi đó các địa chỉ chứa Instr sẽ có thể bị thay thế một cách thích đáng nếu sử dụng chiến lược LRU
C Phân loại Cache theo cấu trúc
Qua phần II-A, chúng ta biết rằng cache có nhiều mức khác nhau, mức càng cao thì dung lượng càng lớn và tốc
độ truy xuất càng chậm Điều này có nghĩa L2 lớn hơn rất nhiều so với L1, và L3 lớn hơn hẳn so với L2 Một câu hỏi tự nhiên đặt ra là: liệu L2 có chứa L1 hay không?
Lý do là gì, và làm thế được lợi gì? Như đã trình bày ngay từ đầu, chúng tôi tập trung vào tìm hiểu và nghiên cứu về chip xử lý đa nhân, nên phần này chúng tôi sẽ bỏ qua việc phân tích cấu trúc cache trong chip một nhân Một phân cấp đơn giản được cho trong hình 3 Thông thường, khi có 2 mức cache, mỗi core có một module cache L1 riêng, và cùng nhau chia sẻ một module L2 Trong trường hợp này, chúng ta có 3 sự lựa chọn cho mối quan hệ giữa L1 và L2 [?] Cách thứ nhất: L2 bao
gồm L1, tất cả những địa chỉ có trong L1 đều phải có trong L2 [?] Điều này thật sự rất hữu ích, bởi vì L2
chứa cả L1-A và L1-B Khi CPU yêu cầu L1-A một địa chỉ mà L1-A không có địa chỉ này nhưng L1-B có, nếu L2 không chứa hai module L1 thì sẽ rất khó để L1-A lấy được thông tin mà CPU yêu cầu Ở đây, vì L2 chứa
Trang 4Hình 3: Hai module cache L1 cùng chia sẻ một module
L2
cả L1-B nên sẽ chứa luôn dữ liệu mà L1-A đang cần
Tuy thuận lợi cho truy xuất là vậy, nhưng cách tổ chức
này có một nhược điểm rất lớn: tốn chi phí lưu trữ Mọi
dữ liệu lưu ở một mức cache nào đó đều được lưu lại
trong những mức cache cao hơn, đây thật sự là một lãng
phí lớn trong khi kích thước của các module cache rất
nhỏ Bên cạnh đó, cách làm này cần phải đảm bảo một
ràng buộc để tận dụng được ưu thế của mình, đó là dung
lượng L2 phải không được nhỏ hơn tổng dung lượng của
các module L1 Cách lưu trữ thứ hai khắc phục nhược
điểm của cách thứ nhất: Tất cả những gì được chứa trong
L1 thì không được chứa trong L2, và tương tự cho các
module cao hơn [?] Cách lưu trữ này tận dụng tối đa
không gian lưu trữ, nhưng sẽ rất tốn chi phí về băng
thông trên chip khi dữ liệu cần thiết đang chứa ở một
module cache cùng cấp Một cách tổng quan, cách thứ
nhất tận dụng tối đa thời gian truy xuất, và cách thứ hai
tận dụng tối đa không gian lưu trữ, ưu điểm của cách
làm này là nhược điểm của cách còn lại Trong thực tế,
ngoài hai cách này, người ta còn có cách thứ ba: dữ liệu
có ở L1 thì có thể có hoặc có thể không có ở L2 [?][?].
Tuy không có ưu điểm rõ ràng như hai cách trên, nhưng
giải pháp này cũng không vướng phải những nhược điểm
tương ứng
D Phân loại Cache theo chiến lược ghi
Mọi thao tác mà CPU tác động lên bộ nhớ chính đều
thông qua bộ nhớ cache với vai trò trung gian Khi CPU
muốn ghi vào bộ nhớ chính, dữ liệu sẽ được ghi tạm lên
cache, và cache sẽ chọn thời điểm tốt nhất để ghi vào
bộ nhớ chính Về cơ bản, có 2 thời điểm cache ghi dữ
liệu vào bộ nhớ chính, tương ứng với hai kiểu hoạt động
khác nhau [?] Kiểu thứ nhất tốn thời gian, ghi lại nhiều
lần nhưng rất an toàn, không lo có sai sót: ghi dữ liệu
xuống bộ nhớ chính ngay sau khi CPU ghi xuống cache
Trong trường hợp chúng ta cần ghi nhiều lần lên một địa
chỉ nào đó, phương pháp này tỏ ra kém hiệu quả vì tốn
băng thông hệ thống kết nối trên chip Trường hợp thư
hai tối ưu hơn, nhưng cũng phức tạp hơn: chờ đến khi
địa chỉ đang chứa dữ liệu ghi bị loại ra để lấy chỗ cho địa chỉ mới thì mới ghi vào bộ nhớ chính [?] Cho dù
được ghi chép nhiều lần lên cùng địa chỉ, nhưng vì địa chỉ được lưu trên cache nên việc ghi dữ liệu chiếm rất
ít thời gian Vấn đề nảy sinh khi nhiều chip xử lý cùng ghi, hoặc một số chip đọc và một số chip ghi, khi đó,
ta cần đến một cache coherency protocol [5], nghĩa là một cách thức để đảm bảo sự toàn vẹn và thống nhất dữ liệu Chi tiết về các giao thức này chúng tôi không trình bày ở đây, bạn đọc nếu muốn tìm hiểu có thể tham khảo trong [6], [7], [8]
III MÔ PHỎNGCMPBẰNGMULTI2SIM Multi2Sim (M2S) [?] là một công cụ rất linh hoạt để
người dùng tìm hiểu về CMP M2S là một phần mềm mã nguồn mở, cho phép người dùng tạo ra, thay đổi và can thiệp đến mức sâu nhất đối với CMP Tuy nhiên, chúng tôi không trình bày tất cả những gì M2S cung cấp mà chỉ giới hạn ở những phần thiết kế tổ chức bộ nhớ cache M2S thật sự là một môi trường bắt đầu không thể tốt hơn cho những ai có ý định tìm hiểu và nghiên cứu về CMP Chúng ta có thể giả lập một CMP rất đơn giản bằng các file INI dưới dạng text Một CMP gồm có nhiều nhân, nhiều cache ở các mức khác nhau, mạng nội bộ nối các module lại với nhau, và cuối cùng là bộ nhớ chính Tất cả những phần này được trình bày chi tiết trong những mục tiếp theo
A Phần nhân
Cấu hình phần nhân là một phần quan trọng trong việc giả lập một CMP Những gì chúng ta cần làm là viết các dòng cấu hình vào tập tin mem-config Nội dung chúng
ta viết được cho trong bảng I
[Entry <Tên>] Tên của nhân Type Loại nhân (CPU hay GPU) Arch Kiến trúc tập lệnh Core Số thứ tự của nhân trong CMP Thread Số lượng tiểu trình chạy trên nhân ComputerUnit Số thứ tự của đơn vị tính toán trong GPU DataModule Nơi nhận lệnh
InstModule Nơi nhận dữ liệu Module Đơn vị phục vụ cho GPU Bảng I: Cấu hình cho một nhân CMP
Những thành phần bắt buộc phải có, nếu chúng ta không thực hiện cấu hình thì cấu hình mặc định sẽ được
sử dụng Do đó, trong các tập tin INI, chúng ta chỉ cấu hình những tham số thật cần thiết hoặc những phần chúng ta quan tâm mà không cần bận tâm quá nhiều về
hệ thống
Trang 5B Phần bộ nhớ
Để cấu hình cho các module của bộ nhớ, chúng ta
cần hai bước : cấu hình hình dạng và cấu hình cho từng
module Trước hết là phần cấu hình hình dạng Bảng II
cho ta chi tiết cấu hình Cũng như cấu hình cho nhân,
phần này được thực hiện trong tập tin mem-config
[CacheGeometry <Tên>] Tên hình dạng
Set Số lượng set trong module đang xét
Assoc Số lượng Associative, hay số way
BlockSize Kích thước 1 block (line)
Policy Chính sách thay thế
MSHR Số lượng truy cập cache tối đa
tại một thời điểm Port số lượng cổng
Bảng II: Cấu hình hình dạng bộ nhớ
Phần hình dạng này cho phép chúng ta xác định những
tham số cơ bản nhất, chung nhất cho một mức cache hay
một loại module nào đó Ví dụ như dòng đầu tiên có nội
dung "CacheGeometry L1" thì đây là các tham số chung
cho tất cả các module trong CMP Khi đó, các module
L1 trong CMP có cùng số set, assoc, cùng kích thước,
cùng chính sách thay thế Một điều lưu ý là tham số
Policy chỉ được nhận một trong ba giá trị: LRU, FIFO
hoặc Random
Sau khi đã có những tham số chung cho các mức trong
bộ nhớ, bảng III cung cấp cho chúng ta các tham số cần
thiết để cấu hình hoàn chỉnh cho một module
Type Loại module (cache, bộ nhớ chính)
Geometry Hình dạng
LowNetwork Mạng bên dưới
LowNetworkNode Nút mạng bên dưới
HighNetwork Mạng bên trên
HighNetworkNode Nút mạng bên trên
LowModules Các module phía dưới
BlockSize Kích thước 1 block
Ports Số lượng cổng
DirectorySize Kích thước Directory
DirectoryAssoc Số way của Directory
AddressRange Khoảng địa chỉ có thể
lưu trong module đang xét Bảng III: Cấu hình các module của bộ nhớ
C Phần mạng nội bộ
Mạng nội bộ là mạng nối các module trong cùng một
mức cache hay giữa các mức cache với nhau Để cấu
hình một mạng, chúng ta làm việc trên hai tập tin:
mem-config chứa những thông tin cơ bản về mạng và tâp tin
net-config chứa nội cung chi tiết cho từng mạng Bảng
IV cung cấp các tham số cơ bản để cấu hình một mạng nội bộ trong tập tin mem-config
Tham số Ý nghĩa [Network <Tên>] Tên mạng DefaultInputBufferSize Kích thước vùng nhớ tạm
cho việc đọc dữ liệu DefaultOutputBufferSize Kích thước vùng nhớ tạm
cho việc ghi dữ liệu DefaultBandwidth Băng thông Bảng IV: Cấu hình cơ bản cho mạng
Để cấu hình chi tiết cho mạng, chúng ta can thiệp vào tập tin net-config Tập tin này gồm các lệnh trong bảng
IV và được bổ sung thêm các tham số trong bảng V trong trường hợp mạng phức tạp
[Network.<Tên mạng>.Node.<Tên>] Tên của nút
[Network.<Tên mạng>.Link.<Tên>] Tên của liên kết
Source Nút nguồn của liên kết Dest Nút đích của liên kết Type Loại liên kết
(một chiều hay hai chiều) Bảng V: Cấu hình chi tiết cho mạng
Như vậy, chúng ta đã có mọi tham số cần thiết để cấu hính ra một CMP cho riêng mình Phần tiếp theo
sẽ cung cấp cho chúng ta phương tiện để đánh giá một thiết kế CMP có hiệu quả hay không
D Đánh giá hiệu năng khi thực hiện mô phỏng bằng Multi2Sim
Để đánh giá hiệu quả của một chip nói chung và một CMP nói riêng, chúng ta cần chạy thử một số chương trình ứng dụng nào đó để có được kết quả thực tế nhất Trong nghiên cứu và cả trong công nghiệp, những chương trình chuyên dùng để kiểm tra hiệu quả của chip được gọi là benchmark Có rất nhiều benchmark khác nhau, phù hợp với các mục đích khác nhau Chúng tôi chọn benchmark Splash-2 để kiểm tra hiệu quả khi thiết
kế CMP trên M2S Splash-2 là một gói benchmark gồm
11 benchmark khác nhau Tất cả chúng đều là các tập tin thực thi nhằm giải quyết các vấn đề kinh điển trong lý thuyết tính toán song song như: N-Body, LU, Cholesky Factorization [1][?]
IV THỬ NGHIỆMMULTI2SIM VÀO THIẾT KẾCMP
A Thiết kế
Trước tiên, chúng ta cần một sơ đồ cấu trúc cho CMP Một thiết kế được đề nghị trong hình 4
Trang 6Hình 4: Thiết kế CMP
CMP mà chúng tôi đề nghị có 8 nhân, tương ứng với
đó là 8 module data-L1 được ký hiệu d0 đến d7 và 8
module inst-L1 được ký hiệu i0 đến i7 Mỗi nhóm gồm
4 cặp module L1 data - inst cùng chia sẻ một module
L2 Bên canh đó, bộ nhớ chính được chia thành 4 phần
(4 banks) bằng phương pháp xen kẽ (interleave) Những
phần này được liên kết với các module L2 bởi một mạng
nội bộ dạng vòng
B Cấu hình
Trước tiên, chúng ta cấu hình phần hình dạng cho các
mức cache, chi tiết như trong hình 5
Hình 5: Cấu hình phần hình dạng cho các mức cache
Hình 6 cho chúng ta cấu hình của một cặp module
L1 data và L1 inst Bảy cặp còn lại cấu hính hoàn toán
tương tự
Hình 6: Cấu hình cho các module L1
Trong hình 7, các module L2 được cấu hình với dung
lượng lớn hơn nhiều so với các module L1
Hình 7: Cấu hình cho các module L2
Các module của bộ nhớ chính được cấu hình tương tự trong hình 8 Phần địa chỉ sử dụng phương pháp xen kẽ với kích thước các khoảng xen kẽ là 64 bytes, bằng với dung lượng của một blocksize trong bộ nhớ chính
Hình 8: Cấu hình cho các module bộ nhớ chính
Đến đây, phần cấu hình cho các module đã hoàn tất Tiếp theo là phần cấu hình cho các nhân Việc cấu hình các nhân là tương tự nhau nên chúng tôi chỉ trình bày cấu hình cho một nhân trong hình 9
Cuối cùng, phần cấu hình cho mạng nội bộ được trình bày trong hình 10 Cấu hình một mạng phải hoàn tất rất nhiều chi tiết nhỏ về nút mạng và các liên kết, do khuôn khổ bài báo có giới hạn nên chúng tôi chỉ trình bày tiêu
Trang 7Hình 9: Cấu hình cho các nhân
biểu một số phần
(a) Tổng quan về mạng (b) Cấu hình nút
(c) cấu hình liên kết
Hình 10: Cấu hình cho mạng nội bộ
C Chạy mô phỏng và thống kê kết quả
Đầu tiên, chúng tôi muốn tìm một mức dung lượng
L1, và L2 tối ưu nhất cho Splash-2 Hình 11 cho ta
thấy thống kê về tỷ lệ cache miss ở L1 theo thay
đổi theo dung lượng cache L1 và L2 Dễ hiểu rằng
khi dung lượng cache L1 tăng lên thì tỷ lệ miss ở
L1 sẽ giảm Trục hoành là dung lượng của cache
L1/L2 tương ứng là: 8K/64K, 16K/128K, 32K/256K,
64K/512K, 128K/1024K, 256K/2048K Từ kết quả trên
hình 11, chúng ta thấy khi dung lượng L1 tăng lên đến
64K thì tỷ lệ cache miss không giảm nữa mà đạt tới mức
bão hoà Điều này chứng tỏ các ứng dụng trong Splash-2
có không gian địa chỉ làm việc nằm trong tầm 64 KB
Do đó trong các bước mô phỏng tiếp theo, chúng tôi
chọn sử dụng dung lượng cache L1 bằng 64 KB
Tiếp theo, chúng tôi chạy mô phỏng nhiều lần cho tất
cả 11 chương trình benchmark trong Splash-2 với thiết
kế đã trình bày ở phần trước Ứng với mỗi chương trình,
chúng tôi cho cả 8 nhân cùng chạy, mỗi nhân chạy một
tiểu trình giải quyết một phần của bài toán Với mục tiêu
xem xét hiệu quả của phân cấp bộ nhớ, chúng tôi quan
tâm đến các thông số HitRatio và MissRatio, chính là
tỉ lệ truy xuất dữ liệu thành công và thất bại ở bộ nhớ
Hình 11: Sự biến thiên của MissRatio khi thay đổi dung lượng cache
cache Đầu tiên, chúng ta cùng xem xét HitRatio trung bình tại các cache L1, ứng với 8 nhân của CMP
Hình 12: HitRatio ở mức L1 tại các cache tương ứng với
8 nhân của chip CMP Một cách trực quan, hình 13 cho chúng ta nhận thấy ngay HitRatio ở các cache Inst, hay các cache chứa lệnh, cao hơn hẳn so với ở các cache dữ liệu Điều này được
lý giải như sau: trong kiến trúc X86, mỗi lệnh đều có
ít nhất một đối số, trong đó chủ yếu là các lệnh có 2 đối số Do đó, số lượng lệnh trong một chương trình ít hơn nhiều, có khi chỉ bằng phân nửa số lượng địa chỉ
dữ liệu Điều này dẫn đến cache dữ liệu nhanh đầy hơn,
số địa chỉ bị loại ra cũng nhiều hơn dẫn đến nhân phải truy xuất xuống bộ nhớ chính để lấy dữ liệu tại địa chỉ
đó trong tương lai khi cần
Tiếp theo, chúng ta cùng xem xét MissRatio tại các mức cache theo các chương trình khác nhau Những chương trình khác nhau sẽ chứa những lệnh và dữ liệu khác nhau, do đó, kết quả sẽ rất khác nhau giữa các chương trình Chúng ta cùng xem hình 13 để thấy sự khác biệt này
Trong nhiều trường hợp, chúng ta có thể quan sát được
dễ dàng MissRatio ở L2 là cao nhất, và L1-Inst là thấp nhất Benchmark thứ 9 - Raytrace là một ngoại lệ khi MissRatio ở L1 rất cao Lý do là chương trình Raytrace làm việc trên một kích thước dữ liệu lớn và có mức
độ rời rạc cao hơn so với các chương trình khác trong Splash-2 Cache L2 có tỉ lệ MissRatio cao nhất cũng là
Trang 8Hình 13: MissRatio ở các mức cache khi chạy 11
benchmark trong Splash-2
điều dễ hiểu khi L1 là nơi chứa các lệnh và dữ liệu phổ
biến nhất, những gì lưu ở L2 có mức độ phổ biến thấp
hơn nên khả năng tái truy xuất cũng thấp hơn, từ đó dẫn
đến MissRatio tăng
Để phân tích sự cân bằng của Splash-2 trong việc sử
dụng nguồn lực trên chip, chúng tôi thực hiện thí nghiệm
như trên hình 14 và 15 Hai hình này thể hiện tương ứng
phần trăm yêu cầu đọc và ghi từ các nhân trên chip Kết
quả trên cả 2 hình cho thấy các tác vụ thực thi được
phân chia một cách cân bằng giữa các nhân xử lý Riêng
nhân xử lý số 1 luôn có tỷ lệ truy xuất bộ nhớ cao vì
đây là nhân mặc định là nhân chủ, ngoài việc thực hiên
riêng tác vụ được phân, nhân này sẽ thực hiện việc quản
lý toàn bộ chương trình
Hình 14: Phân bố lệnh Read theo các nhân của CMP
Hình 15: Phân bố lệnh Write theo các nhân của CMP
D Thảo luận về kết quả
Phần IV-C chỉ trình bày các kết quả một cách trực quan, chúng ta sẽ thảo luận chi tiết hơn về kết quả Tính toán cụ thể cho ta các kết quả trong bảng VI
Cache HitRatio L1-Inst 98.5 % L1-Data 90.8 % L1-Average 94.7 % L2 86.6 % Bảng VI: HitRatio ở các mức cache
Từ bảng VI, chúng ta dễ dàng tính được tỉ lệ truy xuất thất bại ở cả 2 mức cache là 0.7%, nghĩa là cache đã
hỗ trợ CMP trong việc truy xuất bộ nhớ ở 99.3% trường hợp Đây thật sự là một con số rất ấn tượng
V KẾT LUẬN Nghiên cứu này đã trình bày có kết hợp thực nghiệm việc thiết kế vi xử lý đa nhân sử dụng Multi2Sim Chúng tôi cũng đã sử dụng benchmark chuẩn Splash-2 để đánh giá thiết kế CMP và từ đó đánh giá một số đặc tính của Splash-2 như dung lượng tối ưu của cache L1 và L2 để thực thi Splash-2, sự phân chia tác vụ của Splash-2 lên các nhân trong hệ thống Kết quả cho thấy sự phân bố tác vụ khá đều của Splash-2 lên 8 nhân của hệ thống
và hệ thống tối ưu về hiệu suất ở dung lượng cache L1 bằng 64 KB
VI CÁM ƠN Nghiên cứu này được tài trợ một phần kinh phí từ
đề tài cấp nhà nước theo hợp đồng số 01/2011/HD-KHCN/ICDREC
TÀI LIỆU [1] IBM Research Laboratoty “64-Bit CPUs: Alpha, SPARC, MIPS, and POWER,” PC Magazine February 21, 2002
[2] Sandeep Shukla et al "A Brief History of Multiprocessors and EDA" Design and Test of Computer Vol 28, issue 03, pp: 96 May/June 2011
[3] W Wolf, “The future of multiprocessor systems-on-chips” Proc 41st Annu Des Autom Conf pp 681–685 2004
[4] D E Culler, J P Singh, and A Gupta Parallel Computer Architecture: A Hardware/Software Approach San Francisco, CA: Morgan Kaufmann 1999
[5] Nathan Blinker et al The Gem5 Simulator ACM SIGARCH Computer Architecture News, 2011
[6] Rafael Ubal and David Kaeli et al “The Multi2Sim Simulation Framework: A CPU-GPU Model for Heterogeneous Computing” The 20st International Conference on Parallel Architectures and Compilation Techniques (PACT) 2011
[7] Doug Burger and Todd M Austin "The SimpleScalar Tool Set, Version 2.0" University of Wisconsin-Madison Computer Sciences Department Technical Report No 1342 June, 1997
Trang 9[8] Christian Bienia, Sanjeev Kumar, Jaswidner Pal Singh and Kai
Li "The PARSEC Benchmark Suite: Characterization and
Ar-chitectural Implications" Technical Report TR-811-08, Princeton
University January 2008
[9] Major Bhadauria, Vince Weaver and Sally A McKee "A
Char-acterization of the PARSEC Benchmark Suite for CMP
De-sign" Technical Report CSL-TR-2008-1052, Cornell University.
September 2008
[10] Barrow-Williams, Nick, Christian Fensch, and Simon Moore.
"A communication characterisation of Splash-2 and Parsec."
Workload Characterization, 2009 IISWC 2009 IEEE
Interna-tional Symposium on IEEE, 2009
[11] Steven Cameron Woo et al "The SPLASH-2 Programs:
Char-acterization and Methodological Considerations" Proceedings
of the 22nd Annual International Symposium on Computer
Architecture June 1995
[12] Maurice V Wilkes "Moore’S law and the future" Technical
report 2002
[13] Clements, Alan "Principles of Computer Hardware" Oxford
University press 2006
[14] Toy, Wing and Zee, Benjamin "Computer Hardware/Software
Architecture" Prentice Hall 1986
[15] Hennessy, John and David A Patterson "Patterson, David.
Computer Architecture: A Quantitative Approach (Fifth ed.)".
Elsevier publishing house 2012
[16] Rajeev Balasubramonian et al "Memory Hierarchy
Reconfigu-ration for Energy and Performance in General Purpose Processor
Architectures" Proceeding MICRO 33 Proceedings of the 33rd
annual ACM/IEEE international symposium on
Microarchitec-ture Pages 245-257 2000
[17] Harvey G Cragon "Memory systems and pipelined processors,
Chapter 4.1: Cache Addressing, Virtual or Real" 1996
[18] Nader Khammassi and Jean-Christophe Le Lannn "Design and
implimentation of a cache hierachy aware task scheduling for
parallel loops on multicore architectures" Computer Science and
Information Technology, pp 427-439 2014
[19] Fang Zheng, Chitra Venkatramani, Rohit Wagle and Karsten
Schwan "Cache Topology Aware Mapping of Stream Processing
Applications onto CMPs" IEEE 33rd International Conference
on Distributed Computing Systems 2013
[20] Sukumar Ghosh "Cache memory" Lecture notes in Computer
Organization course 2015
[21] Mark D.Hill and Alan Jay Smith "Evaluating Associativity in
CPU Caches" IEEE Transactions on Computers Vol 38 1989
[22] Paul Genua "A Cache Primer" Freescale Secmiconductor 2004
[23] Sangyeun Cho and Lory Al Moakar "Augmented FIFO cache
replacement policies for low power embedded processor"
Jour-nal of Circuits, Systems, and Computers, Vol 18, No 6, pp
1081–1092 2009
[24] Nan Guan, Xinping Yang, Mingsong Lv and Wang Yi "FIFO
Cache Analysis for WCET Estimation: A Quantitative
Ap-proach" Proc of DATE 2013
[25] O’Neil, Elizabeth J O’Neil, Patrick E Weikum, Gerhard.
"The LRU-K Page Replacement Algorithm for Database Disk
Buffering" Proceedings of the ACM SIGMOD International
Conference on Management of Data, pp 297–306 1993
[26] Nimrod Megiddo and Dharmendra S Modha "Outperforming
LRU with an Adaptive Replacement Cache Algorithm"
Com-puter journal Published by the IEEE ComCom-puter Society 2004
[27] Natalie Enright and Dana Vantrease "To Include or Not To
Include: The CMP Cache Coherency Question" Final report
CS838
[28] Aamer Jaleel, Eric Borch, Malini Bhandaru, Simon C Steely
Jr, and Joel Emer "Achieving Non-Inclusive Cache Performance
With Inclusive Caches Temporal Locality Aware (TLA) Cache
Management Policies" In International Symposium on Microar-chitecture (MICRO), Atlanta, Georgia December 2010 [29] Ying Zheng, Brian T Davis and Matthew Jordan "Performance Evaluation of Exclusive Cache Hierarchies" Performance Anal-ysis of Systems and Software, IEEE International Symposium on
- ISPASS 2004 [30] Norman P Jouppi "Cache Write Policies and Performance" Proc 20th International Symposium on Computer Architecture (ACM Computer Architecture News), pp 191-201 1993 [31] Gernot Heiser "Cache write policy" Lecture notes in Advanced Operating Systems course UNSW 2002
[32] Daniel J Sorin, Mark D Hill, David A Wood "A Primer on Memory Consistency and Cache Coherence" Morgan Claypool Publishers 2011
[33] Hesham Altwaijry, Diyab S Alzahrani "Improved-MOESI Cache Coherence Protocol" Arabian Journal for Science and Engineering, Volume 39, Issue 4, pp 2739-2748 2014 [34] F J JIMÉNEZ et al "Teaching the cache memory coherence with the MESI protocol simulator" Spain.
[35] K Hwang and Z Xu "Scalable Parallel Computing: Tech-nology, Architecture, Programming" McGraw-Hill, New York 1998.