Ceci s'adresse à ceux qui installent leur FreeBSD à partir des sources et peuvent ainsi donner à Clang/llvm des billes pour compiler au plus près de l'architecture processeur. C'est surtout important lorsque vous utilisez des poudrieres, donc lorsque vous compiler pour une cible différente de l'hôte.
Le premier échelon est de regarder ce que donnent les première lignes au boot:
david:~>dmesg | grep 'CPU:' -A 10 CPU: Intel(R) Core(TM) i3-4170 CPU @ 3.70GHz (3700.23-MHz K8-class CPU) Origin="GenuineIntel" Id=0x306c3 Family=0x6 Model=0x3c Stepping=3 Features=0xbfebfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,DTS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE> Features2=0x7fdafbbf<SSE3,PCLMULQDQ,DTES64,MON,DS_CPL,VMX,EST,TM2,SSSE3,SDBG,FMA,CX16,xTPR,PDCM,PCID,SSE4.1,SSE4.2,MOVBE,POPCNT,TSCDLT,AESNI,XSAVE,OSXSAVE,AVX,F16C,RDRAND> AMD Features=0x2c100800<SYSCALL,NX,Page1GB,RDTSCP,LM> AMD Features2=0x21<LAHF,ABM> Structured Extended Features=0x27ab<FSGSBASE,TSCADJ,BMI1,AVX2,SMEP,BMI2,ERMS,INVPCID,NFPUSG> XSAVE Features=0x1<XSAVEOPT> VT-x: PAT,HLT,MTF,PAUSE,EPT,UG,VPID TSC: P-state invariant, performance statistics real memory = 17179869184 (16384 MB) -- CPU: Intel(R) Core(TM) i3-4170 CPU @ 3.70GHz (3700.00-MHz K8-class CPU) Origin="GenuineIntel" Id=0x306c3 Family=0x6 Model=0x3c Stepping=3 Features=0xbfebfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,DTS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE> Features2=0x7fdafbbf<SSE3,PCLMULQDQ,DTES64,MON,DS_CPL,VMX,EST,TM2,SSSE3,SDBG,FMA,CX16,xTPR,PDCM,PCID,SSE4.1,SSE4.2,MOVBE,POPCNT,TSCDLT,AESNI,XSAVE,OSXSAVE,AVX,F16C,RDRAND> AMD Features=0x2c100800<SYSCALL,NX,Page1GB,RDTSCP,LM> AMD Features2=0x21<LAHF,ABM> Structured Extended Features=0x27ab<FSGSBASE,TSCADJ,BMI1,AVX2,SMEP,BMI2,ERMS,INVPCID,NFPUSG> Structured Extended Features3=0x9c000600<MCUOPT,MD_CLEAR,IBPB,STIBP,L1DFL,SSBD> XSAVE Features=0x1<XSAVEOPT> VT-x: PAT,HLT,MTF,PAUSE,EPT,UG,VPID TSC: P-state invariant, performance statistics
Installez cpuc pour plus de précisions, ou llvm-tblgen
.
Ici, c'est un modèle dit haswell
d'après la documentation.
Obtenez la topologie de votre système:
sysctl kern.sched.topology_spec kern.sched.topology_spec: <groups> <group level="1" cache-level="3"> <cpu count="12" mask="fff,0,0,0">0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11</cpu> <children> <group level="2" cache-level="2"> <cpu count="2" mask="3,0,0,0">0, 1</cpu> <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags> </group> <group level="2" cache-level="2"> <cpu count="2" mask="c,0,0,0">2, 3</cpu> <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags> </group> <group level="2" cache-level="2"> <cpu count="2" mask="30,0,0,0">4, 5</cpu> <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags> </group> <group level="2" cache-level="2"> <cpu count="2" mask="c0,0,0,0">6, 7</cpu> <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags> </group> <group level="2" cache-level="2"> <cpu count="2" mask="300,0,0,0">8, 9</cpu> <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags> </group> <group level="2" cache-level="2"> <cpu count="2" mask="c00,0,0,0">10, 11</cpu> <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags> </group> </children> </group> </groups>
Consultez /usr/share/mk/bsd.cpu.mk
pour déterminer le code de votre architecture processeur et précisez le CPUTYPE
dans make.conf
de vos poudrières par exemples.
?=
, sinon un make buildworld
peut échouer.
grep 'CPUTYPE.*==' /usr/share/mk/bsd.cpu.mk | less -X david:~>grep 'CPUTYPE.*==.*haswell.*' /usr/share/mk/bsd.cpu.mk ${CPUTYPE} == "haswell" ${CPUTYPE} == "haswell"
Dans l'exemple précédent, c'est un haswell, ce qui donne les options suivantes:
MACHINE_CPU = avx2 avx sse42 sse41 ssse3 sse3
Puisque l'on est sur de l'architecture (MACHINE_CPUARCH
) amd64
.
root@machine:~ # find /usr/local/etc/poudriere.d/*make.conf -exec grep CPUTYPE {} + /usr/local/etc/poudriere.d/ampache-default-make.conf:CPUTYPE?=haswell /usr/local/etc/poudriere.d/flarum-default-make.conf:CPUTYPE?=sandybridge /usr/local/etc/poudriere.d/llanura-default-make.conf:CPUTYPE?=haswell /usr/local/etc/poudriere.d/machine-default-make.conf:CPUTYPE?=haswell /usr/local/etc/poudriere.d/owncloud-default-make.conf:CPUTYPE?=haswell /usr/local/etc/poudriere.d/popeye13-default-make.conf:CPUTYPE?=sandybridge
Machine
est donné comme CPU E3-1246
, soit un Xeon. Il suffit de consulter la datasheet pour y voir le modèle haswell
.
Popeye
est donné comme i7-3930K
, soit un Intel Core (à ne pas confondre avec core2
). Il suffit de consulter la datasheet pour y voir le modèle sandybridge
.
Les architectures de type x86 (Intel ou AMD) sont composés de couches successive dont un micro-code qui émule les fonctions les plus complexes. Ce micro-code est souvent mis à jour dans le cadre de correctifs, notamment lors de la découverte de failles de sécurités.
Installez le port sysutils/cpu-microcode ou sysutils/cpu-microcode-rc pour mettre à jour automatiquement au démarrage ce code, au besoin. Notez qu'il existe des ports séparés selon le constructeur:
Le port -rc
ne permet une mise à jour qu'à la fin du processus de démarrage. C'est un service qui se règle dans /etc/rc.conf
:
microcode_update_enable="YES"
Lancez le:
service microcode_update onestart
Le premier port permet aussi une mise à jour dès le début du processus de démarrage et se règle dans le /boot/loader.conf
:
cpu_microcode_load="YES" cpu_microcode_name="/boot/firmware/intel-ucode.bin" # cpu_microcode_name="/boot/firmware/amd-ucode.bin"
Lancez une mise jour sans redémarrer:
service microcode_update onestart