Lập trình lấy thông tin phân cấp bộ đệm CPU chính xác trên Linux


9

Tôi đang cố gắng để có được một mô tả chính xác về hệ thống phân cấp bộ đệm dữ liệu của CPU hiện tại trên Linux: không chỉ kích thước của các bộ đệm dữ liệu L1 / L2 / L3 (và có thể là L4), mà còn là cách chúng được phân chia hoặc chia sẻ lõi.

Chẳng hạn, trên CPU của tôi (AMD Ryzen Threadripper 3970X), mỗi lõi có bộ đệm dữ liệu L1 32 KB và bộ đệm L2 512 KB, tuy nhiên bộ đệm L3 được chia sẻ trên các lõi trong một phức hợp lõi (CCX). Nói cách khác, có 8 bộ đệm L3 riêng biệt, mỗi bộ nhớ 16 MB.

Phần "Cache" trong ảnh chụp màn hình CPU-Z này trên Windows về cơ bản là những gì tôi đang cố gắng tìm hiểu:

Ảnh chụp màn hình CPU-Z

Tôi không có vấn đề gì khi nhận những thông tin này trên Windows GetLogicalProcessorInformation().

Tuy nhiên, trên Linux, có vẻ như sysconf()chỉ cung cấp cho tôi kích thước bộ đệm cho mỗi lõi cho bộ đệm dữ liệu L1 và L2 ( _SC_LEVEL1_DCACHE_SIZEhoặc _SC_LEVEL2_DCACHE_SIZE) hoặc tổng kích thước bộ đệm L3 ( _SC_LEVEL3_CACHE_SIZE).

EDIT: đầu ra của lstopo trong VMWare . Máy ảo có 8 nhân. Thông tin bộ đệm L1 và L2 đều ổn nhưng kích thước bộ đệm L3 có vẻ không chính xác:

Ảnh chụp màn hình lstopo


1
Điều này có thể giúp ... Askubfox.com/a/214302
Mark Setchell

Tôi đã có một cái nhìn về lstopo, dự án này là tuyệt vời nhưng có thể quá mức cho nhu cầu của tôi. Điều tôi thực sự bối rối là sự pha trộn giữa các kích thước bộ đệm cho mỗi lõi và không theo lõi được trả về sysconf(). Làm thế nào để hiểu ý nghĩa của chúng nếu chúng ta không biết liệu bộ nhớ cache có được chia sẻ hay không?
François Beaune

Bạn có muốn chương trình của mình sử dụng điều này để quyết định điều gì đó về việc bắt đầu bao nhiêu luồng hoặc mặt nạ ái lực CPU nào không? Hay bạn muốn thông tin hiển thị cho người dùng? Dù bằng cách nào, bạn có thể cần phải sử dụng chính lệnh x86 cpuidtrên ISA đó và thậm chí có thể nhúng một số chi tiết bố cục bộ đệm theo mô hình. IDK có bao nhiêu chi tiết các lá CPUID khác nhau như sandpile.org/x86/cpuid.htmlm#level_0000_0004h có thể đại diện.
Peter Cordes

1
Bạn có thể thử lstopoLinux trên kim loại trần không? (ví dụ: khởi động USB trực tiếp). Kết quả không có thật của bạn có thể là lỗi của VM vì vậy chúng tôi nên loại trừ. Không có gì ngạc nhiên khi nó hoạt động như mong đợi trên máy tính để bàn i7-6700k của tôi, hiển thị tất cả 4 lõi trong cùng một gói chia sẻ bộ đệm L3. Nhưng Intel Sandybridge-Family là dòng CPU x86 được sử dụng rộng rãi nhất và gần đây không thay đổi.
Peter Cordes

1
Lưu ý rằng lstopocũng có sẵn cho Windows . lstoposử dụng cpuidhướng dẫn (và có thể SRATbảng ACPI ). cpuidtương đối dễ sử dụng nhưng Intel và AMD khác nhau rất nhiều về khía cạnh này. hwloc( lstopothuộc về) có giao diện API mà bạn có thể sử dụng để có được cấu trúc liên kết bộ đệm cả trên Windows và Linux.
Margaret Bloom

Câu trả lời:


3

Một bức tranh đầy đủ về hệ thống phân cấp bộ đệm có thể được tìm thấy bằng lập trình bằng cách mở các tệp trong /sys(sysfs).

Mỗi "luồng" hoặc "bộ xử lý logic" được đại diện bởi một thư mục con trong /sys/devices/system/cpu/. Trong thư mục đó, bạn sẽ tìm thấy một thư mục bộ đệm. Ví dụ, thông tin bộ đệm cho bộ xử lý logic đầu tiên có thể được tìm thấy ở đây:

$ ls /sys/devices/system/cpu/cpu0/cache/
index0
index1
index2
index3
power
uevent

Mỗi thực thể bộ đệm được liên kết với bộ xử lý logic đó được đại diện bởi một index[0-9]*thư mục. Số sau chỉ số không đại diện cho cấp độ. Thực thể bộ đệm giống nhau có thể được liệt kê nhiều lần trong các bộ xử lý logic khác nhau. Trong các thư mục này, bạn có thể tìm thấy tất cả các thuộc tính của thực thể bộ đệm (mức, bộ, kích thước dòng, v.v.).

$ ls /sys/devices/system/cpu/cpu0/cache/index0
coherency_line_size
level
number_of_sets
physical_line_partition
power
shared_cpu_list
shared_cpu_map
size
type
uevent
ways_of_associativity

Tài liệu đầy đủ có thể được tìm thấy ở đây .

Quan trọng nhất, để có được đầu ra bạn muốn, bạn sẽ cần kiểm tra shared_cpu_list:

$ cat /sys/devices/system/cpu/cpu0/cache/index0/shared_cpu_list
0,28

Điều này sẽ cho bạn thấy những gì bộ xử lý logic chia sẻ thực thể bộ đệm này. Bằng cách kiểm tra tất cả các thực thể ( /sys/devices/system/cpu/cpu*/cache/index*/) và loại bỏ trùng lặp bằng cách sử dụng shared_cpu_list, bạn có thể truy cập theo chương trình tất cả dữ liệu bạn yêu cầu.

Lưu ý rằng trình ảo hóa của bạn không bắt buộc phải truyền thông tin chính xác. Điều này sẽ chỉ cho bạn thấy hệ thống phân cấp bộ đệm khi hạt nhân khách nhìn thấy nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.