From 22e3171457674c00e9b70d9b6d011c3041c6be5b Mon Sep 17 00:00:00 2001 From: Victoriya Fedotova Date: Fri, 26 Jun 2026 04:40:13 -0700 Subject: [PATCH 1/6] Initial commit --- software/scikit-learn-intelex/README.md | 64 +++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 software/scikit-learn-intelex/README.md diff --git a/software/scikit-learn-intelex/README.md b/software/scikit-learn-intelex/README.md new file mode 100644 index 0000000..5687a01 --- /dev/null +++ b/software/scikit-learn-intelex/README.md @@ -0,0 +1,64 @@ +This chapter contains information about the practicies that lead to better performance of scikit-learn-intelex on Intel CPUs. + +# Hardware Configuration + +## Energy Performance Bias (EPB) + +Is an Intel Xeon hardware setting controlling the trade-off between power consumption and processing performance. +For the best perfomrance it is recommended to set it to `0` - Performance. + +### On Windows + +Run following command in `cmd`: + +``` +powercfg -setacvalueindex scheme_current sub_processor PERFEPP 0 +``` + +[More info about `powercfg`](https://learn.microsoft.com/en-us/windows-hardware/customize/power-settings/options-for-perf-state-engine-perfenergypreference). + +### On Linux + +To check the current value of EPB run: +``` +sudo cpupower info +``` + +To set EPB to Performance mode: +``` +sudo cpupower set -b 0 +``` + +## CPU Frequency Scaling + +is a technique that dynamically adjusts processor clock speed based on workload demands. It lowers CPU cores frequencies during idle periods to reduce power consumption. +For better performance it is recommended to set clock speed to higher frequency. + +### On Windows 11 + +Select **Start** > **Settings** > **System** > **Power & battery**. + +Under [**Power**](https://support.microsoft.com/en-us/windows/change-the-power-mode-for-your-windows-pc-c2aff038-22c9-f46d-5ca0-78696fdf2de8#category=windows_11) mode, choose the **Best performance** option for **Plugged in** or **On Battery**. + +### On Linux + +Use CPU scaling governor: + +``` +sudo cpupower frequency-set --governor performance +sudo x86_energy_perf_policy -c all performance +``` + +**Note:** If the maximal CPU frequency cannot be achieved, check the [BIOS limitations](https://wiki.archlinux.org/title/CPU_frequency_scaling#BIOS_frequency_limitation). + +## Low Power Efficient Cores (LPE cores) + +are the type of cores available on modern Intel Core processors aimed to manage lightweight background processes independently which allows to power down the main compute tiles and save battery on mobile devices. + +For the best performance it is recommended to exclude LPE cores from the list of CPU cores on which the workload is running. + +# Workload Configuration + +## Hyper-threading + +is an Intel's symultaneous multithreading implementaion that can improve parallelisation of computatons. From 3e1fa7694fe4c04f986cd90c7a6afd05afcd9820 Mon Sep 17 00:00:00 2001 From: Victoriya Fedotova Date: Fri, 26 Jun 2026 04:43:11 -0700 Subject: [PATCH 2/6] Update table of context --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a7ee459..9e37d46 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ We aim to provide a dynamic resource where users can find the latest optimizatio - [Redis](software/similarity-search/redis/README.md) - [Spark](software/spark/README.md) - [scikit-learn](software/scikit-learn/README.md) + - [scikit-learn-intelex](software/scikit-learn-intelex/README.md) - [MySQL & PostgreSQL](software/mysql-postgresql/README.md) - [Envoy](software/envoy/README.md) - [Kafka](software/kafka/README.md) From 6cc553b847ae86f8a96fa72c1caf485a2da402f8 Mon Sep 17 00:00:00 2001 From: Victoriya Fedotova Date: Fri, 26 Jun 2026 06:58:19 -0700 Subject: [PATCH 3/6] Update --- software/scikit-learn-intelex/README.md | 63 ++++++++++++++++-- .../images/cpu-affinity-ht.png | Bin 0 -> 2990 bytes .../images/cpu-cores-indices-ht.png | Bin 0 -> 12644 bytes .../scikit-learn-intelex/images/cpu-ht.png | Bin 0 -> 45857 bytes .../images/cpu-specifications.png | Bin 0 -> 15217 bytes 5 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 software/scikit-learn-intelex/images/cpu-affinity-ht.png create mode 100644 software/scikit-learn-intelex/images/cpu-cores-indices-ht.png create mode 100644 software/scikit-learn-intelex/images/cpu-ht.png create mode 100644 software/scikit-learn-intelex/images/cpu-specifications.png diff --git a/software/scikit-learn-intelex/README.md b/software/scikit-learn-intelex/README.md index 5687a01..7f52eb1 100644 --- a/software/scikit-learn-intelex/README.md +++ b/software/scikit-learn-intelex/README.md @@ -51,14 +51,69 @@ sudo x86_energy_perf_policy -c all performance **Note:** If the maximal CPU frequency cannot be achieved, check the [BIOS limitations](https://wiki.archlinux.org/title/CPU_frequency_scaling#BIOS_frequency_limitation). +# Workload Configuration + +## Hyper-threading (HT) + +is an Intel's symultaneous multithreading implementaion that can improve parallelisation of computatons. +When HT is enabled, for each processor core that is physically present, the operating system addresses two logical cores and shares the workload between them when possible. In this case the logical cores located on a single physical core use the same resources. +For the recourse-demanding workloads like scikit-learn-intelex it is recommended to disable HT either in BIOS settings or by modifying the affinity settings of the process. + +### On Windows + +Hyper-threading can be deteched by running **Task Manager**. The navigate to **Performance** > **CPU** tab. + +The number of physical and logical cores are listed in bottom right corner of the tab. I case the number of logical cores is greater, HT is enabled: + +![alt text](images/cpu-ht.png) + +According to this picture the hyper-threading is enabled on two P-cores. Here is an illustration of the locations of the bits corresponding to those P-cores in the affinity mask of the system: + +![alt text](images/cpu-cores-indices-ht.png) + +To disable the hyper-threading for a process the affinity mask in binary format should look like: + +![alt text](images/cpu-affinity-ht.png) + +Which is an equivalent to `2BFF` in hexadecimal format. Run following command to disable HT on Windows: + +``` +start /affinity 2BFF cmd /c +``` + +### On Linux + +Hyper-threading can be detected by running `lscpu` utility. Here is the example output for Intel Xeon Platinum 8480+: + +``` +... +Vendor ID: GenuineIntel +Model name: Intel(R) Xeon(R) Platinum 8480+ +CPU family: 6 +Model: 143 +Thread(s) per core: 2 +Core(s) per socket: 56 +Socket(s): 2 +... +NUMA node(s): 2 +NUMA node0 CPU(s): 0-55,112-167 +NUMA node1 CPU(s): 56-111,168-223 +... +``` + + ## Low Power Efficient Cores (LPE cores) are the type of cores available on modern Intel Core processors aimed to manage lightweight background processes independently which allows to power down the main compute tiles and save battery on mobile devices. -For the best performance it is recommended to exclude LPE cores from the list of CPU cores on which the workload is running. +For the best performance it is recommended to exclude LPE cores from the list of CPU cores on which the workload is running. The affinity settings of the process have to be modified to acheive this. -# Workload Configuration +### On Windows -## Hyper-threading +Use [Intel Processor Identification Utility](https://www.intel.com/content/www/us/en/download/12136/intel-processor-identification-utility-windows-version.html?wapkw=intel%20processor%20identification) to locate the LPE cores within the system affinity mask -is an Intel's symultaneous multithreading implementaion that can improve parallelisation of computatons. +``` +start /affinity "program.exe" +``` + +### On Linux diff --git a/software/scikit-learn-intelex/images/cpu-affinity-ht.png b/software/scikit-learn-intelex/images/cpu-affinity-ht.png new file mode 100644 index 0000000000000000000000000000000000000000..342b1489c1393c91f9722adc6ef14361a6261307 GIT binary patch literal 2990 zcmcImXIN9&7LB8hf}_}#u12H;MG=e$7-`W2q)G`0Q2`5)8bcWBAmbotWI!;6DiQ*L zK!y&9Bs!=_ub~D35s;QhAavm!ocF$Oe!Vw;-j93MIo~~Z-*fg}YwsOpX?}6Lq>Lm4 z0@;qbWNZzA{Ll~PhFgCGV~i)u2fzlr^+iKSexuwNSZumwaM=I?DTvv&a(y#cOZZ&E z;31G5RqM}&YVT|}2xOZP%GlsafXh^0h-JcP%KPa@DIXXYc)zH;l{hDP_=qhzLe|8( zyC#w5ej}yljPkjL&w2Z>H2NmMI0lbF({{b}}peNX|X4j-YpL|qx=hpIAozcb=8-M>&-7~|r2{6gX zD$YX4J%4{SIJ{Fnsg2K9M+J&%l>4?qAS?2$K~Y~zOZv)6F!84W89RnUy6mg=-G*8+ zwjLfi$R~1RNLn!1JU%tWJ6^{Bgd9oM``NmUb{StiqIKqshk#!p=t|DG7?VS#z6HiR zI%xOr|3JLkSb-mnr%>ogUaT6DnY5f-`?8SBtgknNYi4C+7?t(;C+VIUohs|M3kj*z z<(!E3e!bBG@vS&6E{WfQWht%Q-SnzRDco3V zrk5K!ER0*~-JdU>=w!$0G@V~&JUi}0OY-J)lg#LJx)laP5s5_n5AolY=V7|KPWX{} zU#QLa#00OupBW^q>?E1p!Qt8pT&riBjif4KRS%rF+FYl>Wz>;1*e!&LL6JNOxhA?i zS;{3`ureDyuz*Ri? z#&FG{zM(BVF+0sPO@DWMa`NPfQyDK`8e%Y*90uba)Fvk<=ibVKFR!D66|0(Vd1;~} zuPthiGB~e5;59rtiu3VlCe@=*D66w_9iMBS_I-%IaOed|7M}C!6`y2=DRhg9j*c$& z;Hkki-9bpAjgREe>EMQQQ@vT9y`}W@^fx3kiO4E77|cdXhLABKdJr#^HVw^=QtJ07 zKc9B7FIxTjh`_=br2x-5lo*GktYu6;aA&!8Kk~YZzC9(Eu+rP4?Qy@4n}1J!m0~Vf zBSwi*PO9`rJrJb?`~?o2Y*E71{`M<+%PH@;+A5>%-g&6_6tDrMK_*$t% zKyMGrOU;aci3kgn#c@VZjq^?PjG&s}W5W43u{6sY>zGXqHWD{!w7%K5c&_{iwt=l^ z&lrto*FQdh4YmS4>M3-81TN9q`jSdL+J|q_2lT*V)BN!G%iJrd^F5JAH%AyKDJfA9 zBlQ}cEbQDMIp`U7?)q42Lh~?t{Yg1>)WOpL-<#8oYU}E3?Cr_2luzW4;^N}l9Slqlo5);W8^OKV_D74Hw-OiaIC!&xz`3gE<1lM_Zvmzbi;^u z`0dsu@?AMnFNNiZxIfm9*^gM>zTFs_xO0Ieo3v|HETw(KJ^m(>pUGd0@fg2fO}O~Z zJY?3uEGv}V;GFtL2NTN#LhulNtaL2BOOZ_~xYeYPnU#f`>M5bkw*bHL`BxLjWL#~$ zs@jPYfIb7{kV~x$Opz9T#Ed{7jB%C)c-PY_etFC8ilG&^7Tp!?gcu17N9j)eTf@x? ztFfHIIXK!}e(3$NS2O*~N+=zrei=2^{tlxw28$WoN8x|qRVYGd5%Bm=k z5E8U;hh$o)x(B2d;R)xJUbGkJEV%{^{Vt9Y(6dslfhYHCxJ)8xn<5P4b^MHZJfKRn zuWx||4ksQ-@>YXFt4IxB>&|OxY8K;1%~N#nND~tiue;IMd;)i}N@HFfjGy#jhwJ9E zCCXr5eG-msy374IcY~Pw{`1~YL0uKOkaj8VhQ7SfNYvfATIa+oGAn!+^{5nGC<>h> zT9o>9YR@+9ouubK&$`WwH1xdsxoFWIvn9g7*4{q1xVW8UMmgpB+uUS##>Z>-^T4J*kIk4RZFb zh&@4w1gvS-PHWi$fh@eVhiJ5^ znCv2fQi&p?wIF4mOspoltbh4ATMhyl*k-b*aI?r>&`Q-6c6LL#*1(|5f~#?xu>S=h zGs|=^e7bF9?8z`9;pn;uPBVq=<@C(NGJix&GRQ~QZ@mm|a;Y%g=AZ0eee7t~la|?Q znVeGb<>OtxjzrJwHmbE#mv^7a9 zN5`B1y?kw42Pm@B0aw#4KgcKTk$eEke_w%4Xm@p@HV(`ixR!6f=a|EaeMKvUQm}dT zJ;SoV>0dY2!T}8I`ri;sUD&Sh@E{49K%uCjYAct6YSmT_5Tm3EQrpJ2PFDq*5y>}}K@AR!{LOf)m2efI1ZurrJt9d)u3v2avR1 ztF9*`B&f=eSl?^v-`WjE7^I!YQ`OeC1(_Kb$K#6{(-7Vqhh+UAJF!?CI1s)CltTw~ zS|6J@QBbXbhvHoV1~=<33`EH22NugxM71zxHfTLo$PbMociiEZ`>rP^s7+#G;@(H^ z?#=fR*|Dnf^74Tbd1ZTl>Itp6rX|D6WpZ-D!#BWLf3+QY)4%F!4u5+02yJTG_HY-J z{~>v1v$_+kn7VR#wU&LSKOdKNN$o zQ{QhB7|4>PfNn#2czC$N74PWeBwm_evWF)8s)n87a&mK(P;FTjL@0h~X(>K7b`Tiz z^c24nLU%{0C|3)h%JwCtrRcb48dw1m&_&q1mK(eg5NDy+w@2b166har?B82r5gWxb W8=|}1zMTfPAt)1b<9x$w_x}a!{?YOP0YOSYKtd1|P+CH|JC2Idp`akGBA_C1=mw<(LAL_w~et z@OL0YK??rCak;5<70LO|I13-}E#=hZ5Cj`_>cE5mKA&(@)^kA+YEJYQN988R3W5mk zswl|a@-$o=#<*&mr^u{$(7K&fR7ndkm9uRT6o2r1#7S$L8Cfgft1^ z^K>soe~dq;dy-H~vgBLD!%~r?=Rr?RNZ06^u!qO$bj|ulVD^l%HU)3NQVA<}3ro$? zHkr@zZ)p{Z!e>6M`)(Sf8@pGw&x?s!jh1;Wxv1y!wX(3m&)ZWUQ~P8U(4T4M0C5WV z(V`X%rb6GCco)X;NY2ib1`y5X2Rx`myO@*+M$#SZyrz9jK zMC`D-d=u*rgyW4%1{;1Cn3fEh2*=l3MEsO~uFPR~Y*CI*Z1$x}tht`8h(t^?epYwr z?)r3=U8?^c&w;-TV!Xe#$j!~ItoQi)Q_AARganbr^D!qx6aUFRwC!7Te{z*IX?E(> zKxSGRUZR-89h=F0ytemEO-&@REl`u2BUU)H!PHSAc}_6s;J|ms zSDJ(JgnEqv8&1h!L{bvtE4A~JlasZJ?wOnGyS{?)YQb=J#W4Ctfo)F0SDJZkeZ9Rj zvY<*pan3K}}UAGPT4?dZvD5b zgpaQ;Y6dh}VHbi^!(iMhG3QyCqSD^H!5MR;B@M!3iXxhtnzBX*Q!yMV%kpqw;4Vz% zXHO3sIdQFhi6zPFi9iH>94nv|L9|?CyS3Rz^3`7}519 zt+JBwku2io=4LH3RV|F|w?&?9jir^9>8NXXSBku~UszId|M$1}yt~;e-c|2&avB>W7*=;CqHKB;VGgbxG5ah?ewzhV;#5!1 z9lD2nD$%;v?-%r&74-9YxVc#k81ToD$l7gtR|zAR8A)ySp4OSrJzUuI?iNkYZJp}e zI87Kp*Zbzm$ljiJ(LY^lr%#_2M#_qcZg=ItBNL|CnW9<|v!FUwyk`@urFRSZZ4;)s zx?HRZ`a1_Em#QraE-yMMM{{6?Rog5IKD6uH5XT7t+4B+q-(8e4IV?YS)Xna5qTPZ~@+e$LI!v9#t7R9khO*Uj!JbZTyBXn=LF z>CNdb#H&5r9?jj|-Rw2eIc5$~_&NBTUFqRcjOy7tS!ZEsAIZu}-IVrPGlP|%{Qdjm z;Z2w*m~RmVTm|{nZ<*SC@X2;NfK2*T{ze&{q`U1vNM3q+dO~V@{lw~qXIRsOsRwGI zb#n!BSD2z~t`3Es<<-1yl#_F=DP!`({fBZ1&)O3zV730&Z?-J4XlU*;?r;?}676L)= z-ed4GJJEZ0pPj+NrMY{&&9knT4SU;j$5Wp?IBsx@wfITUsX|+`jyzT6~DIzAuP8q@yuV%V7*(|$F6l*3N zqRjC)fONc1HgVgAtla981^u5$9pa^YM8{V>2hRAz zLpmPZa?yH|GUT&dg*>BvM-_s9g^A34Y3Kwpv#_9`qM~xQhWX$Zk?gi&n76RqfJps> z)0Opa7r~alwzlGxN9859S)gA8H%-h5#^$n13!rxDYEN75^J~-lx!QRl`yug9dIf|L z5fKoah@W27Eqw5Nz+t4)3+z!lQ==i_k_~x?LY_q%y;`!w*=P4}>T0fW>qmj?VuQAOoMOG}G!(OshS$L{hbM(b6DjucX=gw;x<4YCGgx^ivW6WD)KU);MdHWU@412CQ`_Ce6 z?M-qnp=l|2BT}jU&zt;*a!KeH+^1;&J74Ux7^b23Q9h=v-+vVyO}R1OOLmHe|BNd7 zz<2B<<9^>}yE1VQ%+Y#k18OD|v%~?O%w7HcA9mx=2XBPPRg!tlXO}qss>MOCCL(35 zz2{KH>CTF}bh0t|vi!%aEF1((Ga>cQvoP?iV7K`m)-xwfzCL61+?|ROGW$vn5#!Un z5{-rH=%XcSSw@H!`mpj+dsU_lCm|CVH-w&*-PT$?C+SYCN)7|jDi#W67;1URE95k; z;OgdPGEivsO45TLFnD6>>Ms*$Ph3x3Tqpih9z_tQ@rPRklHB!4fb!Zgz#VkzP7bBq{kUva7Xj)+f$R3 zgsZ)VKBw;$+kTEbC;6klKSVx=G{j)$9=*r|a>(r&H&XdyZwXYc;6k>R-kqevDvaLL z&>(eoaX|-*-j(XS8hHge4Rcq+$2%cZT)&*l^863I;ml6XIQ_>%L;57l(u`f1H=3d_ z2lv4(vG)=b*dD1TikiTv`$`;`B_t)C)+SZ341TKXzuN*vm#0fk!_sXOc}oS?KzMoo z{=MwIdkp+F2hIlzmNIqWbQhn+#d+L$^!%$bWe7fim^|}V>MMsEUE=NwwAUi&pF+$S za_cqt8;x)060YhPdJ)JRjFI6W9;1F@Ff;qIDQYZ(R%)TgvSFz{|H4oi6|%C{Dln1a zvqVvW+6PY6x%#FEhM?G3YVf>g1+G67v-0yPv+iVn>BHW~Lfplw!6@-JEXa+@oH;*! z{OCAnSHemi7GnN3?7EyB&elRd>cWu8|D5IL%!>6rZlicgy#f@FS8Hpc)quq5Wf)x2{jaBa;Q zy$5Eej=5eKwV`GF)!)A@5Lqj$54vpS4|tY|rViy`crQNcJl=sAM}*MI_*ee#hZ=*) zXa$i}%+Y1({e_Dpw1TpHR0c01881JEph;h~Ld_0lBK;n2(V4D#>6o%Z$4oD<*^KfJ zru63e3wk@sW?u@8!?XT|zklb>-sU|oSmgr|n z2202w0rVPSqyQeCk3BuLSTfoOzx<*MEr1KLmhDVPtrD{zM=U&PhHW!DU}t~1CW?an zT5y}fi_d3u^dC($MTNBmI_+&(0r;zHkKk_=Hq*OSvV-C&7 zga~*l{oeJ&FdBhIFwG#C!7VmRUirxud-szxRaBUUkRGv zj<1&L3MY-#1x>uvG5q}FjeJA&8;I=$QBqs9OJ&ncaOUwr`*AqLs z0y_Zh#@2W1qu<~M$bB-ZVFD+ofManr2Lv)lt5E>%>pL&cce5C39&y;y%iM#x1&vp% zZaGkorKHwy#F9*Hc26l6DhWOKsSxgxP0t=d5%gou&V}xDJ&{t6%e?=M|a)Cgw=mF%m__O@X5>Ta$`7MKogS>d}_%zZ$*PM z8eHKMAfeTbt{VUcf;r`_Y;5Z4L#R5syE$XO$FJ5f{Gn>XEQC&I@P5l@OpZo8wieuf z|HUxT>Vy$vV@mDK18hF=puYre?iC@rMFA-;_lx1^5#AeWjm4?-E{3*F81xh$TveyS zR?j&50Y}pF zOXiGGdGYe)Chd?wA@Hrtu8`2slh_v-SS&?d5LxfkOVf6D$pv>w2>wYLmIL$Z0?P~# zo*|@!wb5Vm9G#H}##BlM*AWdk!oq|n?GdkW$plL>-Hlp~@GBlo5(zoav6r@$o#Be~4-9Y+3kjR)si-;Ttd`8D z^|(^Vv>U^$0B334EIJXlRYT8gdmPa>OwNQkaAK5jC649@;T)E9{FOzPdHeQlE3wQj z9{1jCWe(h$QL^0LFkp}$KVIN7s%9K4wvz{%4o=XZ=&CYA)S_NyyDv{B#linp6{|}E zT(!Hq`+Zhc-3uP=Jl|bsV3Mr#5##A`;ZA3#08-ixl~Mqn12#D~Zw&-q`FxCSk@d^c zV19IQH)c8j*E)(bn(7rdlg09Ts=mxTr5VuA#nfu0#4{H)Bx5?pjA*A92lSl-*$Q zXH#sjx%`ho=4^-Yc*_(VDG8#6?Os zd+uFYEGsLMZ6T7avazwjL;7q7Mymk-!Hie-4-?$0@^ty$=jJw5`|S%_e51vFTH8N- z#-Xxap0CRXKpK{?T-;gDz#zi&N+jecBR(tT=qG`Jgq6F$6Uz?_d_@P}RE}7*bz0;$ z$8g~x(uW(`>OP_Xy8lxD5YF4&XK;~lW*Nh-oRU$aa?){F8{=O;w5&e6)o$KFYAu;- za$y0o91f&UV)E(5sAEGo<(pFvSTdydX*O!ygEJ2M#*TXqK6za3xvJ*3CGa)%;C05~ zgI=YbR1bEm!Ay^H=gy&66OgUj_Nm{tRWNDUZ3+f+HB*0o|ELL?&5xizh$gDXVIJ0G zgZaTsI8|eVIfv;lJ98k$)8CU5wme3>h`y5BZrayA#4)9UtWD^OVMr4LHldqm{F!c) z3=9$hhrST238D?+xm>kf-$_seR*71&mzS5RO4{q!DE%%O9Zz0#zjgbzTx~}E$WT?xBn&PFc3U^BO|>>en=nfI(sn#JQ{l1P_*O9t zSR1PfC6K@&`;tC`lIUg*LQ=+HWsYd~@pz_y&NAJ6vlE~0*bFdVlG2X+x_9Ug(N#oL z^le54Auwbx3F{wS6*f6#gorR{dVdY3rq7JKrG&agG-K~GnLqN5@lE=|-2#i#&&G%g zC|q4#Yp2)Wz_s=z4B#K-yS4A;Sv2;xSC@>pn+si@-T&uIYha$o{B?-Vluc1gjYaHB z-*(1s;g&qa9;uM5yD7Hbl_j({qq~~_^Nn@Msg?! zV4L*?uxr4H>H?jn9_+;2kmiYXbpZYhJk-C2+1%V*7i&tup&~J%v+jM-riTwa7-fbq zIO)_I$tT9!#756lP;HjWvLFzK;#$q$lTCyM5RrYESVhUq*XHKW1|EKw-rXUit)FGs z_w*pIINsDEVU%cbRC=zh4rZ6P?>;6veRILaFaVNbaGzqFDV7$N8kovy7qeV0jm(P^ zJ62QgWX(UNQb4o;!oNBB8bY1zX!SW|I(d7MmJY`%MmdRlSY0)#?bk&`XY=_$QA&IN zo)~CNc@mQVRanDgK)`NSN}DD=4;0yG>FI@_xM4x#XBL$AB7!#w`_NLizYr#O-&Uo z&Ii+u<``QU+ZeU& zd(7ARz`>#EF~O;yR2ml}n8k3XoGc}9H0fGptj`?xScXx4IY&yAkdW|Qd}Ne(ZEa2S z_H6=~A+UCA(pd-ApP$3*9m_7(b%qZBa4^t0o|dH(W!tu_me4E2kfyu~M5_ z=puEYi{8J)XW&Y?;}(AGN7e(dC)i3nLNX$R(O1&1RKC~fhy*G9=wrbo6=QyR0%Sx` z9^_)pA)JJS%|;3rG(c#or}SS>%>C`ElhM{$Vbztv8n2e&H$@ksKpxf975QS`fP+$w z`^*=J2ldgc-0dYhZJMAjs;Y*WWPH1o^O)OS2~H59mzvOTxdu#^JmT7=!8m0Oa$f&;mgxgV8TLfbGO=5A^{~S0i>Ag&O#x@Wxb1TlGfJNnm2Faszk5M zq(y~>(O#ePzq!>>>NN38?fgZ5+06BozkkkR4O|l;qUY94{mGiRR?zrGd%o=Zal682@rTu7#2f$@OL2wIJhfM)yF_vL&Yi<3wcU}=B zbciQ_?XIh;Qbb%kz5WRIONV2cA15l;$&1iG?V7!H!`XN4LnewW9mQ>5^)vHPpK@Ou zNbe^#Ck(3=w)a5m82|ipd-T|%pkH(Uy+D7Jj~K#2ACYm|@0R^FP*?LDMy1>K8~-3! zNYSXm22)gn%8=-2sbx|QY<3%A9tZ}Kqj91VquQ$?OoH>m!f-h;@CTw z8eVHr34KqGDtKJ;;e2~C?ePkszTX5ffbRbrrQ$QN{$`>Q+MT77mYz-k>N*f9@cz69 z9c&=xg>uU8uGEnUnbs3CO1cAC(l|ak?C9yScu!^!4;t$@P0bELOG~&PYdJ^2Amzx(+x}r2VgSYANb3(ce@g`AhTlYFRW;y8nXU-+xgh z5mkD5*JXXGEkn_GDk zxFkq}tDtKeqX4Ga5!FB70OjEx-TtZRG^Hq%-PVDa#Rm5Q?PsPpH}wtK!`J&BJ#e8D z$bMm*@|V5VI3k&4B99LD(NBJRB1c;#HDjojFq`Bz&q6BeXENkicRJAD`9`wDQ%Ikt zpc%p@9_{tkjL&qWmCk+45`6H31#8Q_zrEa~E;fuG(+o6xV!d6ai7V9?_YZJ#JlJu< zp6XCs{`EP4_KIg-pRG9NaNfwN?z9-lA3vKw@Bq0@-&WePit?|JIx|GOUvUv-zia`f z|CR>N6tR47*4el}+nF9%^Xt0NXFpU$lA0}=J*9r03RI#3X(u^Cc1h<+;+*QetSn7u zj9Fa1Ku-DG1;)$H3Vcuo?NH3oi42~ep2mCV-9g!s^3$*O@VP!%S8?z(aX6=A?nGA;c_7;p?RaF%SX=`gU4dKuGk2~a6%AoS+&CM3t zRWj)vWORRI+Yyw*%AN5rZeCuhiXQ~zB!o_*e%oV`qr0TYFIfE{X1%uyVXFLP_{%lN z()QK67T8lT3WG`Sso)(zHsNP^?;r@^-v(g=mKGPId-uXXfl+5L&}~_-2E{he5k}Mk z5|}u0>&_ihkaGJ9EXgkL@-_%3TfThx68+Q|c`giOzNIKW%54HvjXPgOUEkriL5AGP zzWek9)p_IPkt$P~Idh-wrG_UbsPceQv6wTzJ4)T3_#)m_jfxeN=%jAt)*MM(xNzY| zPfuX0KnsVS7h49_wsb5PFA%+$vIb8iL2j|s3wl&6es?>m7|Wwqyw zNivGxYIv`erfFo9S}gE)xxC4V9#U~>)J{2@9PVwJ@?=3#=~-f87^tdv8N<8^x6+l9Z5Sp40@frQgI zK4=RRq(N9veh-eeYlslgmz0xNIlIRj!d8E3-@rlqH`16*V0zp?zI9fsNTN ztlRt@l_+yx8FfUjJ7Pc2^vD6jri@@F(#7O`7=O0MEtaozsdHAnR zH-pqJ2rwI@{;|>H!%-oRCH*VM2kSdQm>nXt&evDzbuq{vGUjY8D-Z0a7!a|XWoXS7vY{b=8;^gT-QKkYy5pfpeUm?S}!!t z^Dl{+N3|67_V)t!|08JmFW*3o>A#Y7{!?BG?CR?ae*2b9fsF!-UT#K9GH%&yUsAW| z9@a)9RWa=US)hEqLx~ymk{ot7qVyL4MR zb@_47UG}?q#yFrUJ2_!>VM=VmBy|Lau<27&HdZNom=o&RE8m|V0y>U~kOXde9&Z&UxKt%b; zm*(rj5=qfsXq&Mg{-@Q!x+W

7qTl4IR6$!&p)zhTehBwY$4(Ei2JQ{^IAamoYH` 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 Tp9KDA1frs-p^$Uc`0@V$guUg1 literal 0 HcmV?d00001 diff --git a/software/scikit-learn-intelex/images/cpu-ht.png b/software/scikit-learn-intelex/images/cpu-ht.png new file mode 100644 index 0000000000000000000000000000000000000000..1c40dc8f6756f55dd78995dafbb51fceba643a66 GIT binary patch literal 45857 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 EALbsDW&i*H literal 0 HcmV?d00001 From 71be167fb47f08ddd2ababf9f815c5a12170fa5c Mon Sep 17 00:00:00 2001 From: Victoriya Fedotova Date: Tue, 30 Jun 2026 04:44:38 -0700 Subject: [PATCH 4/6] Update --- software/scikit-learn-intelex/README.md | 127 ++++++++++++------ .../images/cpu-affinity-lpe-cores.png | Bin 0 -> 5761 bytes .../images/cpu-lpe-cores-indices.png | Bin 0 -> 18683 bytes 3 files changed, 88 insertions(+), 39 deletions(-) create mode 100644 software/scikit-learn-intelex/images/cpu-affinity-lpe-cores.png create mode 100644 software/scikit-learn-intelex/images/cpu-lpe-cores-indices.png diff --git a/software/scikit-learn-intelex/README.md b/software/scikit-learn-intelex/README.md index 7f52eb1..fcac71d 100644 --- a/software/scikit-learn-intelex/README.md +++ b/software/scikit-learn-intelex/README.md @@ -1,15 +1,14 @@ -This chapter contains information about the practicies that lead to better performance of scikit-learn-intelex on Intel CPUs. +This chapter contains information about the practices that lead to better performance of scikit-learn-intelex on Intel CPUs. # Hardware Configuration ## Energy Performance Bias (EPB) -Is an Intel Xeon hardware setting controlling the trade-off between power consumption and processing performance. -For the best perfomrance it is recommended to set it to `0` - Performance. +Energy Performance Bias (EPB) is an Intel Xeon hardware setting that controls the trade-off between power consumption and processing performance. For the best performance, it is recommended to set it to `0` (Performance mode). ### On Windows -Run following command in `cmd`: +Run the following command in `cmd`: ``` powercfg -setacvalueindex scheme_current sub_processor PERFEPP 0 @@ -19,7 +18,7 @@ powercfg -setacvalueindex scheme_current sub_processor PERFEPP 0 ### On Linux -To check the current value of EPB run: +To check the current value of EPB, run: ``` sudo cpupower info ``` @@ -31,89 +30,139 @@ sudo cpupower set -b 0 ## CPU Frequency Scaling -is a technique that dynamically adjusts processor clock speed based on workload demands. It lowers CPU cores frequencies during idle periods to reduce power consumption. -For better performance it is recommended to set clock speed to higher frequency. +CPU Frequency Scaling is a technique that dynamically adjusts the processor clock speed based on workload demands. It lowers CPU core frequencies during idle periods to reduce power consumption. For better performance, it is recommended to set the clock speed to a higher frequency. ### On Windows 11 Select **Start** > **Settings** > **System** > **Power & battery**. -Under [**Power**](https://support.microsoft.com/en-us/windows/change-the-power-mode-for-your-windows-pc-c2aff038-22c9-f46d-5ca0-78696fdf2de8#category=windows_11) mode, choose the **Best performance** option for **Plugged in** or **On Battery**. +Under [**Power**](https://support.microsoft.com/en-us/windows/change-the-power-mode-for-your-windows-pc-c2aff038-22c9-f46d-5ca0-78696fdf2de8#category=windows_11) mode, choose the **Best performance** option for **Plugged in** or **On battery**. ### On Linux -Use CPU scaling governor: +Use the CPU scaling governor: ``` sudo cpupower frequency-set --governor performance sudo x86_energy_perf_policy -c all performance ``` -**Note:** If the maximal CPU frequency cannot be achieved, check the [BIOS limitations](https://wiki.archlinux.org/title/CPU_frequency_scaling#BIOS_frequency_limitation). +**Note:** If the maximum CPU frequency cannot be achieved, check the [BIOS limitations](https://wiki.archlinux.org/title/CPU_frequency_scaling#BIOS_frequency_limitation). # Workload Configuration ## Hyper-threading (HT) -is an Intel's symultaneous multithreading implementaion that can improve parallelisation of computatons. -When HT is enabled, for each processor core that is physically present, the operating system addresses two logical cores and shares the workload between them when possible. In this case the logical cores located on a single physical core use the same resources. -For the recourse-demanding workloads like scikit-learn-intelex it is recommended to disable HT either in BIOS settings or by modifying the affinity settings of the process. +Hyper-threading (HT) is Intel's simultaneous multithreading implementation that can improve the parallelization of computations. When HT is enabled, for each processor core that is physically present, the operating system addresses two logical cores and shares the workload between them when possible. In this case, the logical cores located on a single physical core share the same resources. For resource-demanding workloads like scikit-learn-intelex, it is recommended to disable HT either in BIOS settings or by modifying the affinity settings of the process. ### On Windows -Hyper-threading can be deteched by running **Task Manager**. The navigate to **Performance** > **CPU** tab. +Hyper-threading can be deteched by running **Task Manager**. Then navigate to **Performance** > **CPU** tab. -The number of physical and logical cores are listed in bottom right corner of the tab. I case the number of logical cores is greater, HT is enabled: +The number of physical and logical cores is listed in the bottom right corner of the tab. In case the number of logical cores is greater, HT is enabled: ![alt text](images/cpu-ht.png) -According to this picture the hyper-threading is enabled on two P-cores. Here is an illustration of the locations of the bits corresponding to those P-cores in the affinity mask of the system: +According to this picture, hyper-threading is enabled on two P-cores. Here is an illustration of the locations of the bits corresponding to those P-cores in the affinity mask of the system: -![alt text](images/cpu-cores-indices-ht.png) +drawing -To disable the hyper-threading for a process the affinity mask in binary format should look like: +To disable hyper-threading for a process, the affinity mask in binary format should look like: -![alt text](images/cpu-affinity-ht.png) +drawing -Which is an equivalent to `2BFF` in hexadecimal format. Run following command to disable HT on Windows: +Which is equivalent to `2BFF` in hexadecimal format. Run following command to disable HT on Windows: ``` -start /affinity 2BFF cmd /c +start /affinity 2BFF cmd /c python ``` ### On Linux -Hyper-threading can be detected by running `lscpu` utility. Here is the example output for Intel Xeon Platinum 8480+: +Hyper-threading can be detected by running `lscpu` utility as follows: `lscpu -e=cpu,core`. Here is the example output for Intel® Core™ Ultra 7 165U: ``` -... -Vendor ID: GenuineIntel -Model name: Intel(R) Xeon(R) Platinum 8480+ -CPU family: 6 -Model: 143 -Thread(s) per core: 2 -Core(s) per socket: 56 -Socket(s): 2 -... -NUMA node(s): 2 -NUMA node0 CPU(s): 0-55,112-167 -NUMA node1 CPU(s): 56-111,168-223 -... +CPU CORE +0 0 +1 0 +2 1 +3 1 +4 2 +5 3 +6 4 +7 5 +8 6 +9 7 +10 8 +11 9 +12 10 +13 11 ``` +From the output we can see that 4 logical processors (0, 1, 2, 3) are running on two physical cores (0, 1). +To run the process on physical cores only, use one of the following commands: + +``` +numactl -C 0,2,4-13 python +``` +or +``` +taskset -c 0,2,4-13 python +``` ## Low Power Efficient Cores (LPE cores) -are the type of cores available on modern Intel Core processors aimed to manage lightweight background processes independently which allows to power down the main compute tiles and save battery on mobile devices. +Low Power Efficient Cores (LPE cores) are a type of core available on modern Intel Core processors, designed to manage lightweight background processes independently. This allows the main compute tiles to be powered down, saving battery life on mobile devices. -For the best performance it is recommended to exclude LPE cores from the list of CPU cores on which the workload is running. The affinity settings of the process have to be modified to acheive this. +For the best performance, it is recommended to exclude LPE cores from the list of CPU cores on which the workload is running. The affinity settings of the process have to be modified to achieve this. ### On Windows -Use [Intel Processor Identification Utility](https://www.intel.com/content/www/us/en/download/12136/intel-processor-identification-utility-windows-version.html?wapkw=intel%20processor%20identification) to locate the LPE cores within the system affinity mask +Check the CPU specification on the Intel [products page](https://www.intel.com/content/www/us/en/products/overview.html). Here is an example for the Intel® Core™ Ultra 7 165U processor: + +![alt text](images/cpu-specifications.png) + +The location of the LPE cores in the system affinity mask in this case would be: + +drawing + +The recommended affinity mask that disables both hyper-threading and LPE cores would be `2BFC`: + +drawing + +Run the following command to disable HT and LPE cores on Windows: ``` -start /affinity "program.exe" +start /affinity 2BFC cmd /c python ``` ### On Linux + +LPE cores can be detected by running the `lscpu -e=cpu,core,maxmhz` command. Here is the example output: + +``` +CPU CORE MAXMHZ +0 0 4900.0000 +1 0 4900.0000 +2 1 4900.0000 +3 1 4900.0000 +4 2 3800.0000 +5 3 3800.0000 +6 4 3800.0000 +7 5 3800.0000 +8 6 3800.0000 +9 7 3800.0000 +10 8 3800.0000 +11 9 3800.0000 +12 10 2100.0000 +13 11 2100.0000 +``` + +The logical processors with the lowest maximum frequency (12, 13) are running on LPE cores. + +Run the following command to disable HT and LPE cores on Linux: + +``` +numactl -C 0,2,4-11 python +``` + diff --git a/software/scikit-learn-intelex/images/cpu-affinity-lpe-cores.png b/software/scikit-learn-intelex/images/cpu-affinity-lpe-cores.png new file mode 100644 index 0000000000000000000000000000000000000000..2abb3a33378805fa945e7165d39566673a04369e GIT binary patch literal 5761 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 literal 0 HcmV?d00001 From e9d7534bddb94f735f5abdbd3e1e3e4f03e812a1 Mon Sep 17 00:00:00 2001 From: Victoriya Fedotova Date: Wed, 1 Jul 2026 05:12:44 -0700 Subject: [PATCH 5/6] Add common recommendations about system configuration --- software/common/README.md | 48 +++++++++++++++++++++++ software/scikit-learn-intelex/README.md | 51 +------------------------ 2 files changed, 49 insertions(+), 50 deletions(-) create mode 100644 software/common/README.md diff --git a/software/common/README.md b/software/common/README.md new file mode 100644 index 0000000..1979ead --- /dev/null +++ b/software/common/README.md @@ -0,0 +1,48 @@ +Here are the common recommendations about your system configuration that are beneficial for getting maximum performance from the workloads. + +## Energy Performance Bias (EPB) + +Energy Performance Bias (EPB) is an Intel Xeon hardware setting that controls the trade-off between power consumption and processing performance. For the best performance, it is recommended to set it to `0` (Performance mode). + +### On Windows + +Run the following command in `cmd`: + +``` +powercfg -setacvalueindex scheme_current sub_processor PERFEPP 0 +``` + +[More info about `powercfg`](https://learn.microsoft.com/en-us/windows-hardware/customize/power-settings/options-for-perf-state-engine-perfenergypreference). + +### On Linux + +To check the current value of EPB, run: +``` +sudo cpupower info +``` + +To set EPB to Performance mode: +``` +sudo cpupower set -b 0 +``` + +## CPU Frequency Scaling + +CPU Frequency Scaling is a technique that dynamically adjusts the processor clock speed based on workload demands. It lowers CPU core frequencies during idle periods to reduce power consumption. For better performance, it is recommended to set the clock speed to a higher frequency. + +### On Windows 11 + +Select **Start** > **Settings** > **System** > **Power & battery**. + +Under [**Power**](https://support.microsoft.com/en-us/windows/change-the-power-mode-for-your-windows-pc-c2aff038-22c9-f46d-5ca0-78696fdf2de8#category=windows_11) mode, choose the **Best performance** option for **Plugged in** or **On battery**. + +### On Linux + +Use the CPU scaling governor: + +``` +sudo cpupower frequency-set --governor performance +sudo x86_energy_perf_policy -c all performance +``` + +**Note:** If the maximum CPU frequency cannot be achieved, check the [BIOS limitations](https://wiki.archlinux.org/title/CPU_frequency_scaling#BIOS_frequency_limitation). diff --git a/software/scikit-learn-intelex/README.md b/software/scikit-learn-intelex/README.md index fcac71d..cee96e0 100644 --- a/software/scikit-learn-intelex/README.md +++ b/software/scikit-learn-intelex/README.md @@ -1,55 +1,6 @@ This chapter contains information about the practices that lead to better performance of scikit-learn-intelex on Intel CPUs. -# Hardware Configuration - -## Energy Performance Bias (EPB) - -Energy Performance Bias (EPB) is an Intel Xeon hardware setting that controls the trade-off between power consumption and processing performance. For the best performance, it is recommended to set it to `0` (Performance mode). - -### On Windows - -Run the following command in `cmd`: - -``` -powercfg -setacvalueindex scheme_current sub_processor PERFEPP 0 -``` - -[More info about `powercfg`](https://learn.microsoft.com/en-us/windows-hardware/customize/power-settings/options-for-perf-state-engine-perfenergypreference). - -### On Linux - -To check the current value of EPB, run: -``` -sudo cpupower info -``` - -To set EPB to Performance mode: -``` -sudo cpupower set -b 0 -``` - -## CPU Frequency Scaling - -CPU Frequency Scaling is a technique that dynamically adjusts the processor clock speed based on workload demands. It lowers CPU core frequencies during idle periods to reduce power consumption. For better performance, it is recommended to set the clock speed to a higher frequency. - -### On Windows 11 - -Select **Start** > **Settings** > **System** > **Power & battery**. - -Under [**Power**](https://support.microsoft.com/en-us/windows/change-the-power-mode-for-your-windows-pc-c2aff038-22c9-f46d-5ca0-78696fdf2de8#category=windows_11) mode, choose the **Best performance** option for **Plugged in** or **On battery**. - -### On Linux - -Use the CPU scaling governor: - -``` -sudo cpupower frequency-set --governor performance -sudo x86_energy_perf_policy -c all performance -``` - -**Note:** If the maximum CPU frequency cannot be achieved, check the [BIOS limitations](https://wiki.archlinux.org/title/CPU_frequency_scaling#BIOS_frequency_limitation). - -# Workload Configuration +Before you read the information below, it is recommended to read the [common recommendations](../common/README.md) about the system configuration. ## Hyper-threading (HT) From 62a688e46ae7032e50e857b575762cdc04b3681f Mon Sep 17 00:00:00 2001 From: Victoriya Fedotova Date: Wed, 1 Jul 2026 05:32:29 -0700 Subject: [PATCH 6/6] Add the commands to switch off the HT programmatically in bash --- software/scikit-learn-intelex/README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/software/scikit-learn-intelex/README.md b/software/scikit-learn-intelex/README.md index cee96e0..750b2e5 100644 --- a/software/scikit-learn-intelex/README.md +++ b/software/scikit-learn-intelex/README.md @@ -61,6 +61,13 @@ or taskset -c 0,2,4-13 python ``` +The required list of logical processors can be formed programmatically in Bash. In this case, the command sequence looks like: + +```bash +cpus=$(lscpu -e=cpu,core | awk 'NR>1 && !seen[$2]++ {print $1}' | paste -sd,) +numactl -C "$cpus" python +``` + ## Low Power Efficient Cores (LPE cores) Low Power Efficient Cores (LPE cores) are a type of core available on modern Intel Core processors, designed to manage lightweight background processes independently. This allows the main compute tiles to be powered down, saving battery life on mobile devices.