Les accélérateurs Xeon Phi disposant d'une soixantaine constituent un intermédiaire entre les processeurs standards disposant de l'ordre de la dizaine de coeurs (AMD ou Intel) et les circuits graphiques de GPU ou GPGPU disposant de plusieurs milliers d'ALU pour les traitements.
Voici comment installer et faire fonctionner un Xeon Phi sur la distribution Debian Jessie, notamment en OpenCL.
Il est supposé que le système hôte est une Debian Jessie standard, sur une architecture AMD64. Le socle présenté ici était un Dell Poweredge R720 disposant d'une carte Xeon Phi SE10/7120. De manière à ne pas toucher au matériel embarqué et polluer le disque dur de la machine, l'équipement démarre par PXE et monte un disque par iSCSI.
La Debian Jessie disposait d'un noyau 3.16 version 7. Un lspci | grep -i phi
offre la sortie suivante :
42:00.0 Co-processor: Intel Corporation Xeon Phi coprocessor SE10/7120 series (rev 20)
Les composants fournis par Intel sont présents sur le site Intel MPSS pour Manycore Platform Software Stack.
Il n'existe que les paquets pour quelques distributions RedHat ou dérivées : récupération de la dernière version RedHat
mkdir /root/XeonPhi ; cd /root/XeonPhi wget http://registrationcenter.intel.com/irc_nas/4862/mpss-3.4.1-linux.tar
Vérification de la somme de hashage md5sum mpss-3.4.1-linux.tar
:
e985afee031baf542090883d3752fcfa
La documentation MPSS User Guide est indispensable pour commencer.
apt-get install alien
apt-get install pbuilder
apt-get install kernel-package apt-get purge texlive* apt-get autoremove
tar xvf mpss-3.4.1-linux.tar cd mpss-3.4.1 ls *.rpm | xargs -I '{}' alien --scripts '{}'
La liste des paquets crés est la suivante :
glibc2.12.2pkg-libmicaccesssdk0_3.4.1-2_amd64.deb glibc2.12.2pkg-libmicaccesssdk-dev_3.4.1-2_amd64.deb glibc2.12.2pkg-libmicmgmt0_3.4.1-2_amd64.deb glibc2.12.2pkg-libmicmgmt-dev_3.4.1-2_amd64.deb glibc2.12.2pkg-libmicmgmt-doc_3.4.1-2_amd64.deb glibc2.12.2pkg-libodmdebug0_3.4.1-2_amd64.deb glibc2.12.2pkg-libodmdebug-dev_3.4.1-2_amd64.deb glibc2.12.2pkg-libsettings0_3.4.1-2_amd64.deb glibc2.12.2pkg-libsettings-dev_3.4.1-2_amd64.deb glibc2.12.2pkg-mpss-flash_3.4.1-2_amd64.deb glibc2.12.2pkg-mpss-memdiag-kernel_3.4.1-2_amd64.deb glibc2.12.2pkg-mpss-rasmm-kernel_3.4.1-2_amd64.deb intel-composerxe-compat-k1om_3.4.1-2_amd64.deb libscif0_3.4.1-2_amd64.deb libscif-dev_3.4.1-2_amd64.deb libscif-doc_3.4.1-2_amd64.deb mpss-boot-files_3.4.1-2_amd64.deb mpss-coi_3.4.1-2_amd64.deb mpss-coi-dev_3.4.1-2_amd64.deb mpss-coi-doc_3.4.1-2_amd64.deb mpss-coi-staticdev_3.4.1-2_amd64.deb mpss-core_3.4.1-2_amd64.deb mpss-core-dev_3.4.1-2_amd64.deb mpss-daemon_3.4.1-2_amd64.deb mpss-daemon-dev_3.4.1-2_amd64.deb mpss-eclipse-cdt-mpm_3.4.1-2_amd64.deb mpss-hstreams_3.4.1-2_amd64.deb mpss-hstreams-dev_3.4.1-2_amd64.deb mpss-hstreams-doc_3.4.1-2_amd64.deb mpss-license_3.4.1-2_amd64.deb mpss-miccheck_3.4.1-1_amd64.deb mpss-miccheck-bin_3.4.1-1_amd64.deb mpss-micmgmt_3.4.1-2_amd64.deb mpss-micmgmt-doc_3.4.1-2_amd64.deb mpss-micmgmt-python_3.4.1-2_amd64.deb mpss-micsmc-gui_3.4.1-2_amd64.deb mpss-mpm_3.4.1-2_amd64.deb mpss-mpm-doc_3.4.1-2_amd64.deb mpss-myo_3.4.1-2_amd64.deb mpss-myo-dev_3.4.1-2_amd64.deb mpss-myo-doc_3.4.1-2_amd64.deb mpss-offload_3.4.1-2_amd64.deb mpss-offload-dev_3.4.1-2_amd64.deb mpss-sciftutorials_3.4.1-2_amd64.deb mpss-sciftutorials-doc_3.4.1-2_amd64.deb mpss-sdk-k1om_3.4.1-2_amd64.deb mpss-sysmgmt-micdiagnostic_3.4.1-2_amd64.deb mpss-sysmgmt-micras_3.4.1-2_amd64.deb mpss-sysmgmt-python_3.4.1-2_amd64.deb netperf_2.6.0-1_amd64.deb netperf-doc_2.6.0-1_amd64.deb
Il n'est pas possible de directement créer le module MIC sans modifier le code source. Heureusement, En effet, le fichier host/linux.c
doit être modifié pour compiler sur un noyau 3.16 Debian.
Voici les opérations nécessaires poir compiler le module associé au noyau :
mkdir mpss-modules cd mpss-modules rpm2cpio ../src/mpss-modules-3.4.1-1.src.rpm | cpio -idm tar jxf mpss-modules-3.4.1.tar.bz2 wget http://www.cbp.ens-lyon.fr/emmanuel.quemener/software/XeonPhi/PatchDebianJessieMPSS341.patch patch host/linux.c ../PatchDebianJessieMPSS341.patch export INSTALL_MOD_PATH=/lib/modules/$(uname -r)/extra export MIC_CARD_ARCH=k1om make make install depmod -a
Il y a de fortes chances pour que le module mic_host
aie été chargé. Il faut donc le décharger et définir une exclusion
rmmod mic_host echo blacklist mic_host > /etc/modprobe.d/mic.conf
Chargement du module par la commande modprobe mic
Dans le dmesg
on obtient :
[37935.298427] mic 0000:42:00.0: irq 172 for MSI/MSI-X [37935.298475] mic0: Transition from state ready to resetting [37945.235599] [sched_delayed] sched: RT throttling activated [37945.235980] mic_probe 66:0:0 as board #0 [37945.236136] mic: number of devices detected 1 [37946.237184] mic0: Resetting (Post Code 12) [37946.237217] mic0: Transition from state resetting to ready [37946.237248] My Phys addrs: 0xff3c720000 and scif_addr 0x8021bdf040
En tapant ip link show
on obtient :
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN mode DEFAULT link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT qlen 1000 link/ether 00:1e:67:7f:e4:eb brd ff:ff:ff:ff:ff:ff 3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000 link/ether 00:1e:67:7f:e4:ec brd ff:ff:ff:ff:ff:ff 4: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000 link/ether 00:1e:67:7f:e4:ed brd ff:ff:ff:ff:ff:ff 5: eth3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000 link/ether 00:1e:67:7f:e4:ee brd ff:ff:ff:ff:ff:ff 7: mic0: <BROADCAST> mtu 64512 qdisc noop state DOWN mode DEFAULT qlen 1000 link/ether 4c:79:ba:32:0f:71 brd ff:ff:ff:ff:ff:ff
Copie du paramétrage pour le module MIC chargé au démarrage
cat /root/XeonPhi/mpss-3.4.1/mpss-modules/mic.conf >> /etc/modprobe.d/mic.conf echo mic >> /etc/modules
Création du initrd
update-initramfs -k all -u
Sachant que j'utilise plutôt dracut pour la création de mes initrd
dpkg-reconfigure dracut
Les paquets MPSS d'Intel ont été transformés avec alien
dans /root/XeonPhi/mpss-3.4.1
Les paquets mpss-modules sont supprimés. Les autres installés tel que.
cd /root/XeonPhi/mpss-3.4.1 rm *mpss-modules*deb ls *-lib*deb | xargs -I '{}' dpkg -i '{}' ls *deb | grep -v '\-lib' | xargs -I '{}' dpkg -i '{}'
Par défaut les installations se font dans :
/opt/mpss/3.4.1 /opt/intel/mic /etc/mpss /usr/lib64 /usr/linux-k1om-4.7
Ceci n'est plus le cas dans la Debian Jessie. Il est donc nécessaire de rajouter (salement) un chemin allant chercher les librairies dans /usr/lib64
.
Installation d'un LD_LIBRARY_PATH
sur /usr/lib64
:
echo /usr/lib64 >> /etc/ld.so.conf.d/mic.conf
ldconfig
La commande mpssinfo
MpssInfo Utility Log Created Tue Nov 18 20:10:00 2014 System Info HOST OS : Linux OS Version : 3.16.0-4-amd64 Driver Version : 3.4.1-1 MPSS Version : NotAvailable Host Physical Memory : 529403 MB Device No: 0, Device Name: mic0 Board Vendor ID : 0x8086 Device ID : 0x225c Subsystem ID : 0x7d99 Coprocessor Stepping ID : 2 PCIe Width : x16 PCIe Speed : 5 GT/s PCIe Max payload size : 256 bytes PCIe Max read req size : 512 bytes Coprocessor Model : 0x01 Coprocessor Model Ext : 0x00 Coprocessor Type : 0x00 Coprocessor Family : 0x0b Coprocessor Family Ext : 0x00 Coprocessor Stepping : C0 Board SKU : C0QS-7120 P/A/X/D
Pour démarrer le système sur le Xeon Phi, le démon mpssd
s'attend à trouver un /var/lock/subsys
pour créer un /var/lock/subsys/mpssd
. Voici une solution pour que, à chaque démarrage, l'opération soit réalisée :
mkdir /var/lock/subsys sed -i "s/^exit/mkdir\ \/var\/lock\/subsys\nexit/g" /etc/rc.local
Lancement avec la commande suivante : micctrl \-\-initdefaults
dont la sortie est la suivante
[Warning] mic0: Generating compatibility network config file /opt/intel/mic/filesystem/mic0/etc/sysconfig/network/ifcfg-mic0 for IDB. [Warning] This may be problematic at best and will be removed in a future release, Check with the IDB release.
micctrl --config
mic0: ============================================================= Config Version: 1.1 Linux Kernel: /usr/share/mpss/boot/bzImage-knightscorner Map File: /usr/share/mpss/boot/System.map-knightscorner BootOnStart: Enabled Shutdowntimeout: 300 seconds ExtraCommandLine: highres=off PowerManagment: cpufreq_on;corec6_on;pc3_on;pc6_on Root Device: Dynamic Ram Filesystem /var/mpss/mic0.image.gz from: Base: CPIO /usr/share/mpss/boot/initramfs-knightscorner.cpio.gz CommonDir: Directory /var/mpss/common Micdir: Directory /var/mpss/mic0 Network: Static Pair Hostname: r720-mic0.cluster.zone. MIC IP: 172.31.1.1 Host IP: 172.31.1.254 Net Bits: 24 NetMask: 255.255.255.0 MtuSize: 64512 MIC MAC: 4c:79:ba:1a:1e:78 Host MAC: 4c:79:ba:1a:1e:79 LDAP: Disabled NIS: Disabled Cgroup: Memory: Disabled Console: hvc0 VerboseLogging: Disabled CrashDump: /var/crash/mic 16GB
Lancement du démon avec mpssd
Connaissance de d'état de la carte avec micctrl –status
Au début, j'ai :
mic0: booting (mode: linux image: /usr/share/mpss/boot/bzImage-knightscorner)
Après quelques secondes :
mic0: online (mode: linux image: /usr/share/mpss/boot/bzImage-knightscorner)
Définition de l'adresse statique de l'interface mic0 dans /etc/network/interfaces
. De la configuration suivante :
# mic0 BEGIN auto mic0 iface mic0 inet static address 172.31.1.254 netmask 255.255.255.0 # mic0 END
Je préfère passer à une configuration plus étoffée :
auto mic0 iface mic0 inet static address 172.31.1.254 netmask 255.255.255.0 broadcast 172.31.1.255 network 172.31.1.0 post-up /sbin/iptables -t nat -A POSTROUTING -s 172.31.1.0/24 -o eth0 -j MASQUERADE
echo mic >> /etc/modules update-initramfs -k all -u
Chargement de l'interface réseau avec ifup mic0
Connexion sur le xeon-phi avec ssh 172.31.1.1
Vérification du nombre de processeurs avec cat /proc/cpuinfo | grep ^processor | wc -l
lequel donne 244
.
apt-get install amd-clinfo amd-opencl-icd ocl-icd-libopencl1 ocl-icd-dev
Number of platforms: 1 Platform Profile: FULL_PROFILE Platform Version: OpenCL 1.2 AMD-APP (938.2) Platform Name: AMD Accelerated Parallel Processing Platform Vendor: Advanced Micro Devices, Inc. Platform Extensions: cl_khr_icd cl_amd_event_callback cl_amd_offline_devices Platform Name: AMD Accelerated Parallel Processing Number of devices: 1 Device Type: CL_DEVICE_TYPE_CPU Device ID: 4098 Board name: Max compute units: 32 Max work items dimensions: 3 Max work items[0]: 1024 Max work items[1]: 1024 Max work items[2]: 1024 Max work group size: 1024 Preferred vector width char: 16 Preferred vector width short: 8 Preferred vector width int: 4 Preferred vector width long: 2 Preferred vector width float: 4 Preferred vector width double: 0 Native vector width char: 16 Native vector width short: 8 Native vector width int: 4 Native vector width long: 2 Native vector width float: 4 Native vector width double: 0 Max clock frequency: 1200Mhz Address bits: 64 Max memory allocation: 16898804736 Image support: Yes Max number of images read arguments: 128 Max number of images write arguments: 8 Max image 2D width: 8192 Max image 2D height: 8192 Max image 3D width: 2048 Max image 3D height: 2048 Max image 3D depth: 2048 Max samplers within kernel: 16 Max size of kernel argument: 4096 Alignment (bits) of base address: 1024 Minimum alignment (bytes) for any datatype: 128 Single precision floating point capability Denorms: Yes Quiet NaNs: Yes Round to nearest even: Yes Round to zero: Yes Round to +ve and infinity: Yes IEEE754-2008 fused multiply-add: Yes Cache type: Read/Write Cache line size: 64 Cache size: 32768 Global memory size: 67595218944 Constant buffer size: 65536 Max number of constant args: 8 Local memory type: Global Local memory size: 32768 Kernel Preferred work group size multiple: 1 Error correction support: 0 Unified memory for Host and Device: 1 Profiling timer resolution: 1 Device endianess: Little Available: Yes Compiler available: Yes Execution capabilities: Execute OpenCL kernels: Yes Execute native function: Yes Queue properties: Out-of-Order: No Profiling : Yes Platform ID: 0x7f926ed1bce0 Name: Intel(R) Xeon(R) CPU E5-2680 0 @ 2.70GHz Vendor: GenuineIntel Device OpenCL C version: OpenCL C 1.2 Driver version: 2.0 (sse2,avx) Profile: FULL_PROFILE Version: OpenCL 1.2 AMD-APP (938.2) Extensions: cl_khr_fp64 cl_amd_fp64 cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics cl_khr_local_int32_base_atomics cl_khr_local_int32_extended_atomics cl_khr_int64_base_atomics cl_khr_int64_extended_atomics cl_khr_byte_addressable_store cl_khr_gl_sharing cl_ext_device_fission cl_amd_device_attribute_query cl_amd_vec3 cl_amd_printf cl_amd_media_ops cl_amd_popcnt
Seuls les processeurs CPU sont détectés
apt-get install python-pyopencl python-pyopencl-doc
python /usr/share/doc/python-pyopencl-doc/examples/benchmark.py
('Execution time of test without OpenCL: ', 7.673499822616577, 's') =============================================================== ('Platform name:', 'AMD Accelerated Parallel Processing') ('Platform profile:', 'FULL_PROFILE') ('Platform vendor:', 'Advanced Micro Devices, Inc.') ('Platform version:', 'OpenCL 1.2 AMD-APP (938.2)') --------------------------------------------------------------- ('Device name:', 'Intel(R) Xeon(R) CPU E5-2680 0 @ 2.70GHz') ('Device type:', 'CPU') ('Device memory: ', 64463, 'MB') ('Device max clock speed:', 1200, 'MHz') ('Device compute units:', 32) Execution time of test: 0.00112901 s Results OK
Intel publie ses versions de OpenCL.
Il n'est pas possible de disposer directement de la dernière version OpenCL par un simple
cd /root/XeonPhi wget http://registrationcenter.intel.com/irc_nas/4181/opencl_runtime_14.2_x64_4.5.0.8.tgz tar xzf opencl_runtime_14.2_x64_4.5.0.8.tgz cd pset_opencl_runtime_14.1_x64_4.5.0.8/rpm
La conversion peut se réaliser “brutalement” avec un alien
, mais les paquets ne sont pas très propres…
Installation des outils pour la conversion des paquets :
apt-get install builder alien
Pour les paquets corrects :
ls opencl-*pset*.rpm opencl-*mic*.rpm | xargs -I '{}' alien --scripts '{}'
Pour les paquets à modifier :
ls opencl-*base-4*.rpm opencl-*cpu*.rpm | xargs -I '{}' alien -g --scripts '{}' # On degage la possibilite de mettre la libOpenCL de Intel a la place de la standard sed -i "s/update\-alternatives/exit\nupdate\-alternatives/g" opencl-1.2-base-4.5.0.8/debian/postinst # On rentre dans l'archive cd opencl-1.2-base-4.5.0.8 # On build le paquet debuild cd .. # On remplace la priorite du update-alternatives sur l'installation de l'ICD Intel sed -i "s/\-2147489047/65536/g" opencl-1.2-intel-cpu-4.5.0.8/debian/postinst # On rentre dans l'archive cd opencl-1.2-intel-cpu-4.5.0.8 # on build le paquet debuild cd ..
Les paquets générés sont les suivants :
opencl-1.2-base_4.5.0.8-2_amd64.deb opencl-1.2-base-pset_4.5.0.8-2_all.deb opencl-1.2-intel-cpu_4.5.0.8-2_amd64.deb opencl-1.2-intel-mic_4.5.0.8-2_amd64.deb
dpkg -i *.deb
Vérification des périphériques OpenCL détectés :
clinfo | grep "Device Type"
3 composants sont détectés :
Device Type: CL_DEVICE_TYPE_CPU Device Type: CL_DEVICE_TYPE_CPU Device Type: CL_DEVICE_TYPE_ACCRLERATOR
Lancement du test Python OpenCL 'python /usr/share/doc/python-pyopencl-doc/examples/benchmark-all.py' :
Execution time of test without OpenCL: 0.0567140579224 s =============================================================== Platform name: AMD Accelerated Parallel Processing Platform profile: FULL_PROFILE Platform vendor: Advanced Micro Devices, Inc. Platform version: OpenCL 1.2 AMD-APP (1526.3) --------------------------------------------------------------- Device name: Intel(R) Xeon(R) CPU E5-2637 v2 @ 3.50GHz Device type: CPU Device memory: 516995 MB Device max clock speed: 1333 MHz Device compute units: 16 Device max work group size: 1024 Device max work item sizes: [1024, 1024, 1024] Data points: 8388608 Workers: 256 Preferred work group size multiple: 1 Execution time of test: 0.00852657 s Results OK =============================================================== Platform name: Intel(R) OpenCL Platform profile: FULL_PROFILE Platform vendor: Intel(R) Corporation Platform version: OpenCL 1.2 LINUX --------------------------------------------------------------- Device name: Intel(R) Xeon(R) CPU E5-2637 v2 @ 3.50GHz Device type: CPU Device memory: 516995 MB Device max clock speed: 3500 MHz Device compute units: 16 Device max work group size: 8192 Device max work item sizes: [8192, 8192, 8192] /usr/lib/python2.7/dist-packages/pyopencl/__init__.py:61: CompilerWarning: Non-empty compiler output encountered. Set the environment variable PYOPENCL_COMPILER_OUTPUT=1 to see more. "to see more.", CompilerWarning) Data points: 8388608 Workers: 256 Preferred work group size multiple: 128 Execution time of test: 0.00322651 s Results OK =============================================================== Platform name: Intel(R) OpenCL Platform profile: FULL_PROFILE Platform vendor: Intel(R) Corporation Platform version: OpenCL 1.2 LINUX --------------------------------------------------------------- Device name: Intel(R) Many Integrated Core Acceleration Card Device type: ACCELERATOR Device memory: 11634 MB Device max clock speed: 1333 MHz Device compute units: 240 Device max work group size: 8192 Device max work item sizes: [8192, 8192, 8192] Data points: 8388608 Workers: 256 Preferred work group size multiple: 128 Execution time of test: 0.0179208 s Results OK