Σαν κίνητρο, παραθέτω τα αποτελέσματα του Geekbench4 στο μηχάνημά μου:
- Windows 10 (το καλύτερο εφικτό): 5691/19607
- Linux (Παγκόσμιο Ρεκόρ για τον i7 7820HK): 6308/22102 6871/18143
Όπως φαίνεται εκ των αποτελεσμάτων, ο υπερχρονισμός στο Linux όχι μόνο είναι εφικτός, αλλά και με διαφορά καλύτερος από Windows. Ο λόγος επ’ αυτού θα φανεί μέχρι το τέλος του παρόντος οδηγού.
Ας αρχίσουμε!
Προσοχή! Το άρθρο που ακολουθεί είναι το απόσταγμα πολλαπλών ΑΠΟΤΥΧΙΩΝ και προσπαθιών στη διάρκεια ετών εμπειρίας στο θέμα του υπερχρονισμού. Μπορεί να έχει κάμποσα λάθη, οπότε μην διστάσετε να τα αναφέρετε ώστε να μπορέσω να τον εμπλουτίσω στην πορεία.
Προαπαιτούμενα
- Υπερχρονίσιμoς Επεξεργαστής (συνήθως i5/i7 XXXX K )
- Ανάλογο BIOS:
Πριν προχωρήσουμε, βεβαιωθείτε ότι το BIOS σας υποστηρίζει εγγενώς υπερχρονίσιμους επεξεργαστές. Αυτό συνήθως σημαίνει 2 πράγματα: Το BIOS μπορεί να γίνει reset εύκολα σε περίπτωση λάθος - μη σταθερών - ρυθμίσεων ρολογιού καθώς και να μπορεί να κάνει μονο του reset σε περίπτωση laptop. Για παράδειγμα, το σύνηθες είναι να μην γίνεται αυτό σε laptop BIOS’s (Dell’s Alienwares), με μικρές εξαιρέσεις (MSI/Asus). Προσοχή λοιπόν μην φτάσεται να έχετε τουβλο αντί για υπολογιστή… - Προφανώς εγκατάσταση Linux
– Στα πλαίσια του παρόντος οδηγού υποθέτω debian-based διανομές, αν και τα περισσότερα βήματα είναι ίδια - Να έχετε κατεβάσει το datasheet του επεξεργαστή σας. Συνήθως είναι διαθέσιμο στο Intel® Core™ Processors Technical Resources
- Βασικές γνώσεις προγραμματισμού και μετατροπής βάσεων (δυαδικό σε δεκαδικό σε δεκαεξαδικό κλπ) και βασικές γνώσεις αρχιτεκτονικής υπολογιστών
Γενικές κατευθύνσεις και Πληροφορίες
- Λόγω των ανωτέρω περιορισμών σε κάποιες μονάδες BIOS και του κατα συνέπεια κινδύνου, θα κάνουμε υπερχρονισμό μέσα από το λειτουργικό μας σύστημα
2… Αυτό σημαίνει ότι θα είναι αρκετά πιο περίιπλοκο, αλλά πολύ πιο ασφαλές, καθώς ένα reset επαρκεί για να γίνει επαναφορά στις μαμά ρυθμίσεις - Στα Windows, το Intel XTU είναι το σύνηθες εργαλείο υπερχρονισμού και αλλαγής παραμέτρων turbo-boost και TDP. Στα Linux, δεν υπάρχουν φιλικά εργαλεία (καλύτερα κατά τη γνώμη μου). Κατ’επέκταση θα επέμβουμε άμεσα στους καταχωρητές MSR (Model-Specific Registers).
- ΜΗΝ δελεαστείτε να κάνετε αλλαγές απο το BIOS, ειδικά αν δεν έχετε PC η κάποιο Gaming Laptop που να υποστηρίζει υπερχρονισμό. Απ’ όσο ξέρω μόνο τα MSI GT series, ASUS ROG series,SAGER and EUROCOM υποστηρίζουν σωστά υπερχρονισμό.
- Αν τυχόν έχετε ένα από τα παραπάνω μηχανήματα, μπορούμε να επέμβουμε, πέραν του επεξεργαστή, και στη Μνήμη αλλάζοντας το ρολόι και τους χρονισμούς της για ακόμα καλύτερα αποτελέσματα
- Για να επιτευχθεί σωστά η ρύθμιση της Μνήμης, η μητρική ΠΡΕΠΕΙ να υποστηρίζει το πρωτόκολλο XMP.
- P-states
Με την έκδοση 3.9 του πυρήνα του Linux προστέθηκε ο καινούριος οδηγός επεξεργαστών intel, ο intel_pstate. Αρχικά υποστήριζε μόνο τους SandyBridge(2nd generation), αλλά αργότερα προστέθηκαν και οι νεότερες γεννιές επεξεργαστών, μέχρι και την τελευταία.
Ο συγκεκριμένος οδηγός υποστηρίζει το καινούριο σύστημα θερμικού ελέγχου των μοντέρνων επεξεργαστών της Intel και το όνομά του έρχεται από τα P-states.
Τα P-states είναι ουσιαστικά η δυνατότητα του επεξεργαστή να τρέχει σε διαφορετικά επίπεδα (states) τάσης και ισχύος/συχνότητας. Το Ρ0 είναι το μέγιστο σε ταχύτητα, με τα Ρ1 κλπ να ακολουθούν με μειωμένη απόδοση. - Καταστάσεις Ηρεμίας: C-states
Τα C-states είναι καταστάσεις εξοικονόμησης ισχύος, σε αντίθεση με τα Ρ-states. Κατά τη διάρκεια των C-states ο επεξεργαστής κάθεται σε ηρεμία και δεν εκτελούνται εντολες.
C-states:
-C0 είναι το μόνο operational state, δηλαδή ο επεξεργαστής κάνει κάτι (εκτελεί εντολές)
-C1 η πρώτη κατάσταση ηρεμίας
-C2 η 2η κατάσταση ηρεμίας: Ο εξωτερικός ελεγκτής I/O μπλοκάρει τις “Διακοπές” (interrupts) προς τον επεξεργαστή
-κλπ
Βήμα Πρώτο
- Εγκατάσταση του cpufrequtils
void@msi:~$ sudo apt install cpufrequtils - Προβολή μοντέλου και χαρακτηριστικών Επεξεργαστή
void@msi:~$ cpupower frequency-info
Το αποτέλεσμα πρέπει να είναι ως κάτωθι:
analyzing CPU 0:
driver: intel_pstate
CPUs which run at the same hardware frequency: 0
CPUs which need to have their frequency coordinated by software: 0
maximum transition latency: Cannot determine or is not supported.
hardware limits: 800 MHz - 3.80 GHz
available cpufreq governors: performance powersave
current policy: frequency should be within 800 MHz and 3.80 GHz.
The governor “powersave” may decide which speed to use
within this range.
current CPU frequency: Unable to call hardware
current CPU frequency: 913 MHz (asserted by call to kernel)
boost state support:
Supported: yes
Active: yes
Τώρα βεβαιωθείτε ότι το cpu driver γράφει δίπλα intel_pstate και ότι ο perfrormance governor είναι διαθέσιμος σαν επιλογή. Η απενεργοποίηση του pstate driver είναι εφικτή (με παράμετρο στο boot) αλλά δεν συνίσταται, καθώς ο pstate driver είναι συνήθως πιο αποδοτικός από την εναλλακτική (acpi_cpufreq)
Βήμα Δεύτερο
Τα δύσκολα…
Για να πετύχουμε σωστό υπερχρονισμό, θα ελέγξουμε άμεσα τον πολλαπλασιαστή συχνοτήτων των πυρήνων, τις τάσεις τροφοδοσίας τους και το όριο Θερμικής Ισχύος TDP. Πριν προχωρήσουμε, πρέπει να εξηγήσω τα βασικά του πως ελέγχεται ένας επεξεργαστής Intel πρωτογενώς.
Κάθε επεξεργαστής έχει κάποιους ειδικούς καταχωρητές, τους Model Specific Registers, or MSR’s, οι οποίοι δίνουν στο λειτουργικό σύστημα και κατ’ επέκταση μέσα από κλήσης συστήματος, στο χρήστη τη δυνατότητα να ελέγξει διάφορες παραμέτρους, μέσω του hypervisor. Π.χ. συχνότητες, τάσεις, ισχύ, θερμικά ορια, ΙΟ κλπ.
Υπάρχουν συνήθως πολλοί MSR, κάποιοι Read Only, κάποιοι Read-Write και κάποιοι Write only, ανάλογα φυσικά με τη λειτουργία που εκτελούν και το μοντέλο επεξεργαστή.
Αντίθετα από τους κλασσικούς καταχωρητές, οι MSR διευθυνσιοδοτούνται σε ένα ειδικό εύρος διευθύνσεων, ορισμένο από τον κατασκευαστή στο εγχειρίδιο (datasheet) και μπορούν να ελεχθούν με τις εντολές Χ86 wrmsr και rdmsr.
Ευτυχώς για εμάς υπάρχει εργαλείο, διαθέσιμο σίγουρα σε Debian κ σε άλλες διανομές, το msr-tools, που μας δίνει τη δυνατότητα να το κάνουμε από τη γραμμή εντολών.
Οπότε, ας το εγκαταστήσουμε:
void@msi: sudo apt install msr-tools*
Στη συνέχεια βεβαιωνόμαστε ότι θα φορτώνεται το ανάλογο kernel module:
*void@msi: sudo echo msr > /etc/modules-load.d/msr.conf
Τώρα έχουμε πρόσβαση στα rdmsr and wrmsr από τη γραμμή εντολών, ως ακολούθως
Διαβάζουμε έναν MSR με το rdmsr 0x(address)
και γράφουμε σε έναν MSR με το wrmsr 0x(address) 0x(value)
. Όταν διαβάζουμε, μπορούμε να ορίζουμε bitmasks με το διακόπτη -f 15:0
(από το bit 0 ως το bit 15, αντιστρόφως).
Βήμα Τρίτο
Τα ακόμα πιο δύσκολα
Δυστυχώς, αντίθετα από τα windows, που έχουμε το Intel XTU, εδώ θα πρέπει να τροποποιήσουμε τους ανάλογους MSR.
Από εδώ και πέρα θα θεωρείται ότι έχετε διαβάσει το datasheet και ότι έχετε βρει τις διευθύνσεις των εν λόγω καταχωρητών και τη λειτουργία αυτών.
Κάποιες από αυτές, μπορεί και όλες, θα είναι ίδιες με τις δικές μου.
Υποθέτουμε λοιπόν τις παρακάτω διευθύνσεις:
- Voltage control
-MSR_ADDR_VOLTAGE(RW) 0x150 - Power control
-MSR_RAPL_POWER_UNIT(RO) 0x606
-MSR_PKG_POWER_LIMIT(RW) 0x610 - Turbo Boost control
-MSR_PLATFORM_INFO(RO) 0x0CE
-MSR_TURBO_RATIO_LIMIT(RW) 0x1AD
Παρόλο που η διαδικασία αλλαγής των τιμών των MSR αναλύεται στο datasheet σε διάφορα σημεία του, θα προσπαθήσω να την εξηγήσω σε ένα βαθμό, καθώς είναι αρκετά διάσπαρτη η πληροφορία.
Power/Energy/Time units
MSR_RAPL_POWER_UNIT
3:0 = Power unit (W) = 1/2^(decimal)W - default: 0.125 Watts
12:8 = Energy unit (J) = 1/2^(decimal)J - default: 0.00006103515625 Joules
19:16 = Time unit (sec) = 1/2^(decimal)sec - default: 0.0009765625 Seconds
Package power limits
MSR_PKG_POWER_LIMIT
14:0 = Pkg power limit = Powerunit * decimal
15:15 = Pkg power enabled - boolean
16:16 = Pkg clamping limit - boolean
23:17 = Pkg power limit time window = 2^(21:17 bit) * (1.0 + (23:22 bit)/4.0 ) * Timeunit
46:32 = Pkg power limit 2 = Powerunit * decimal
47:47 = Pkg power 2 enabled - boolean
48:48 = Pkg clamping limit 2 - boolean
55:49 = Pkg power limit time window = 2^(53:49 bit) * (1.0 + (55:54 bit)/4.0 ) * Timeunit
63:63 = MSR lock - boolean
Turbo boost ratio limit
MSR_PLATFORM_INFO
15:8 = Maximum non-turbo - boolean
28 = Programmable ratio limit for turbo - boolean
29 = Programmable TDP limit for turbo - boolean
30 = Programmable TJ offset - boolean
MSR_TURBO_RATIO_LIMIT
7:0 = Ratio For 1 active Core
15:8 = Ratio 2 active Cores
23:16 = Ratio 3 active Cores
31:24 = Ratio 4 active Cores
Βήμα Τέταρτο
Το “ωραίο” κομμάτι
Χρησιμοποιώντας τις παραπάνω πληροφορίες, μπορούμε πλέον να πειράξουμε τις τιμές των MSR με την παρακάτω εντολή (γενική μορφή):
void@msi:#wrmsr [addr] 0x[hex value]
Ο επεξεργαστής μου έχει από το εργοστάσιο πολλαπλασιαστή 38 σε τουρμπο όταν λειτουργούν και οι 4 πυρήνες. Αυτό το αλλάζω σε 44. Ταυτόχρονα, θα αλλάξω το 25W όριο ισχύος σε 200 με απεριόριστη διάρκεια (1073741824 δευτερόλεπτα) “τουρμπίσματος”.
ΑΠΟ
void@msi:# rdmsr 0x610
42819800dd80b8h
void@msi:# rdmsr 0x1AD
26262626
ΣΕ
void@msi:# rdmsr 0x610
428c8000dd8c80
void@msi:# rdmsr 0x1AD
2C2C2C2C
Βημα Πέμπτο
Κλέβοντας το Benchmark
Μέχρι τώρα αλλάξαμε τους πολλαπλασιαστές συχνότητας και τα όρια TDP, κάτι που λογικά θα κάνει τεράστια διαφορά από μόνο του. Αλλά, λόγω του τρόπου λειτουργίας του πυρήνα του λειτουργικού μας, όταν τρέχουμε το benchmark, θα τρέχει με μεσαία προτεραιότητα. Δεν το θέλουμε αυτό αν θέλουμε καλά νούμερα. Ευτυχώς αυτό αλλάζει εύκολα με τον παρακάτω τρόπο:
void@msi:#chrt --rr 99 geekbench4
Βήμα Έκτο
Ο αριθμός του θηρίου
Ευχαριστώ για την υπομονή των αναγνωστών μέχρι εδώ!
Υ.Γ. Έχω σκοπίμως παραλήψει κάποια βήματα, τα οποία θα προσθέσουν άλλο ένα 15% απόδοση, γιατί ενέχουν κινδύνους.
Παρακαλώ τους αναγνώστες να παραθέσουν τα αποτελέσματά τους και κάποια στιγμή θα ακολουθήσουν και τα “κρυφά” αυτά βήματα…
Απολαύστε ανεύθυνα!
English Version:
As a motivation, i ll start by linking my Geekbench 4 results :
-
Windows 10 (best effort): 5691/19607
-
Linux (World records for i7 7820HK): 6308/22102 6871/18143
As we can see, overclocking in Linux is not only achievable, but by far superior to Windows.
The reason will be apparent by the end of this guide. Lets begin!
Warning! This article is a summary of what I learned over the years of overclocking. It may be full of mistakes, don’t hesitate to report them, so that I can enhance it!
Prerequisites:
- An overclockable CPU (usually i5/i7 XXXX K )
- An overclock supporting BIOS:
Before proceeding, please make sure your BIOS has native support for overclockable CPU’s. This means two things: The BIOS can easily be reset and/or it can reset itself in case of wrongly configured clocks. For example, laptop BIOS’s are usually very hard to reset (Dell’s Alienwares), with few exceptions (MSI/Asus). So beware, you might soft-brick your laptop. - Obviously a Linux Distro of your choice.
– This guide will assume a debian-based distro for the sake of reference, but most steps are identical across distros – - You CPU’s datasheet. You can find it in Intel’s official site, i.e. Intel® Core™ Processors Technical Resources
You’ll need to read the datasheet in order to find the MSR addresses and specs. More on this later on on this guide. - Basic programming and number base conversion knowledge (binary - decimal - hex) as well as a good understanding of basic computer systems architecture
General Directions and Information
- Due to the aforementioned limitations of some BIOS’s and the danger of soft/hard-bricking your laptop, we will be Overclocking from WITHIN our Operating System.
- This means it will be harder to do, but by far safer, as in case of crashes (which will be many), you can simply reset your laptop without having to reconfigure stuff in BIOS.
- On Windows, Intel XTU can be used for modifying turbo-boost parameter and TDP related settings. But on Linux, there are no user friendly tools available. In this article, I will be directly modifying MSR (Model-Specific Registers) to achieve similar results.
- Do NOT be tempted to do it from BIOS, especially if you are not on a PC or a Gaming Laptop that supports overclocking properly. AFAIK Only MSI GT series, ASUS ROG series,SAGER and EUROCOM laptops support it.
- If you happen to own one of the above, we can go further than changing only the CPU clocks and also change RAM clocks and timings, thus achieving even greater performance.
- To properly change RAM clocks and timings (If you fall in the above category) your motherboard MUST support XMP.
- P-states
A new CPU driver intel_pstate was added to the Linux kernel 3.9 (April 2009). First, it only supported SandyBridge CPUs (2nd generation), Linux 3.10 extended it to Ivybridge generation CPUs (3rd gen), and so on and so forth.
This driver supports recent features and thermal control of modern Intel CPUs. Its name comes from P-states.
The processor P-state is the capability of running the processor at different voltage and/or frequency levels. Generally, P0 is the highest state resulting in maximum performance, while P1, P2, and so on, will save power but at some penalty to CPU performance. - Idle states: C-states
C-states are idle power saving states, in contrast to P-states, which are execution power saving states.
During a P-state, the processor is still executing instructions, whereas during a C-state (other than C0), the processor is idle, meaning that nothing is executing.
C-states:
-C0 is the operational state, meaning that the CPU is doing useful work
-C1 is the first idle state
-C2 is the second idle state: The external I/O Controller Hub blocks interrupts to the processor.
-etc.
Step One
- Install cpufrequtils
void@msi:~$ sudo apt install cpufrequtils - Verify your CPU model
void@msi:~$ cpupower frequency-info
Your output should look something like this:
analyzing CPU 0:
driver: intel_pstate
CPUs which run at the same hardware frequency: 0
CPUs which need to have their frequency coordinated by software: 0
maximum transition latency: Cannot determine or is not supported.
hardware limits: 800 MHz - 3.80 GHz
available cpufreq governors: performance powersave
current policy: frequency should be within 800 MHz and 3.80 GHz.
The governor “powersave” may decide which speed to use
within this range.
current CPU frequency: Unable to call hardware
current CPU frequency: 913 MHz (asserted by call to kernel)
boost state support:
Supported: yes
Active: yes
Now, verify that your cpu driver is intel_pstate and that you have the perfrormance governor as an available choice. You can of course disable the pstate driver, but i really do not recommend this as pstate is usually faster than the alternatives (acpi_cpufreq).
Step Two
The hardcore stuff
To overclock properly, we will be controlling the CPU’s frequency multipliers, core voltages and TDP limits.
Before we proceed, i feel i must explain the basics of how an Intel (And others) CPU is controlled.
Every CPU has some special Registers, called Model Specific Registers, or MSR’s, which give the Operating System and, by extension through system calls, the user control over the processor’s hypervisor functions. I.E. frequencies, voltages, power, temperature and throttling, IO pin control and others.
There are usually many MSR’s available, some Read Only, some Read-Write and some Write only, depending on the function and of course, the CPU model.
Unlike regular registers, MSR’s are exposed at special address ranges, defined in each CPU’s datasheet, and can be controlled by the wrmsr and rdmsr X86 instructions.
Luckilly, the is a command line tool, available in Debian, called msr-tools, which wraps these functions in a CLI.
So, first install it:
void@msi: sudo apt install msr-tools*
Then, make sure the proper kernel module is loaded on startup, by issuing
*void@msi: sudo echo msr > /etc/modules-load.d/msr.conf
Now we have access to rdmsr and wrmsr command line tools, as follows:
You can read from MSR with rdmsr 0x(address)
and write to MSR with wrmsr 0x(address) 0x(value)
. When reading, you can specify bitmasks by -f 15:0
(from bit 0 to bit 15, in reverse).
Step Three
The even more hardcore stuff
Unfortunately, unlike windows, where there is a tool available, i.e. Intel XTU, in Linux we ll have to emulate its functions by directly modifying our CPU’s MSR’s.
I will from now on assume you have read the datasheet and found the proper MSR addresses. Some of these addresses, or maybe all of them, will be the same as mine.
MSR Addresses assumptions:
- Voltage control
-MSR_ADDR_VOLTAGE(RW) 0x150 - Power control
-MSR_RAPL_POWER_UNIT(RO) 0x606
-MSR_PKG_POWER_LIMIT(RW) 0x610 - Turbo Boost control
-MSR_PLATFORM_INFO(RO) 0x0CE
-MSR_TURBO_RATIO_LIMIT(RW) 0x1AD
Even though the control procedure of the above MSR’s is detailed within the datasheet in various pages, i ll explain some of them as best i can, as they are hard to figure out:
Power/Energy/Time units
MSR_RAPL_POWER_UNIT
3:0 = Power unit (W) = 1/2^(decimal)W - default: 0.125 Watts
12:8 = Energy unit (J) = 1/2^(decimal)J - default: 0.00006103515625 Joules
19:16 = Time unit (sec) = 1/2^(decimal)sec - default: 0.0009765625 Seconds
Package power limits
MSR_PKG_POWER_LIMIT
14:0 = Pkg power limit = Powerunit * decimal
15:15 = Pkg power enabled - boolean
16:16 = Pkg clamping limit - boolean
23:17 = Pkg power limit time window = 2^(21:17 bit) * (1.0 + (23:22 bit)/4.0 ) * Timeunit46:32 = Pkg power limit 2 = Powerunit * decimal 47:47 = Pkg power 2 enabled - boolean 48:48 = Pkg clamping limit 2 - boolean 55:49 = Pkg power limit time window = 2^(53:49 bit) * (1.0 + (55:54 bit)/4.0 ) * Timeunit 63:63 = MSR lock - boolean
Turbo boost ratio limit
MSR_PLATFORM_INFO
15:8 = Maximum non-turbo - boolean
28 = Programmable ratio limit for turbo - boolean
29 = Programmable TDP limit for turbo - boolean
30 = Programmable TJ offset - booleanMSR_TURBO_RATIO_LIMIT
7:0 = Ratio For 1 active Core
15:8 = Ratio 2 active Cores
23:16 = Ratio 3 active Cores
31:24 = Ratio 4 active Cores
Step Four
The fun part
Using above information, we can now change the MSRs accordingly, using
void@msi:#wrmsr [addr] 0x[hex value]
Since my processor was limited to 38 boost ratio when all 4 cores are active, I changed that limitation to 44. Also, I changed the 25W limit to 200W with unlimited (1073741824 seconds) boost duration.
FROM
void@msi:# rdmsr 0x610
42819800dd80b8h
void@msi:# rdmsr 0x1AD
26262626
To
void@msi:# rdmsr 0x610
428c8000dd8c80
void@msi:# rdmsr 0x1AD
2C2C2C2C
Step Five
Benchmark Cheats
So far, we changed our CPU’s multipliers and TDP limits, which should make a significant difference alone.
But, due to the way the linux kernel preemption works, everytime we run a benchmark, it will run with a medium CPU scheduler priority. We dont want that. So, regarding geekbench4 for example, we are going to be running it with RealTime priority with
void@msi:#chrt --rr 99 geekbench4
Step Six
The number of the (CPU) beast
If you followed this guide so far, i MUST thank you.
PS. I have omitted a couple of optimization steps that will add a 15% performance bonus, as they are a tiny bit dangerous.
So, post your questions and results and if I feel you are ready i will follow up with these two bonuses!
Cheers.