Installation d'un Xeon Phi sous Debian Jessie

Introduction

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.

Installation

Détection du périphérique

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)

Création des paquets Intel

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.

Préparation du système

  • Installation de quoi transformer les paquets RPM en DEB
    apt-get install alien
  • Installation de qui construire des paquets Debian :
    apt-get install pbuilder
  • Installation de quoi compiler un module noyau :
    apt-get install kernel-package
    apt-get purge texlive*
    apt-get autoremove

Transformation des paquets RPM en DEB

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

Compilation du module noyau

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

Chargement du module MIC

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

Installation des paquets MPSS

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.

Installation du composant OpenCL

Installation des composants OpenCL standards

apt-get install amd-clinfo amd-opencl-icd ocl-icd-libopencl1 ocl-icd-dev

Vérification du fonctionnement de OpenCL avec clinfo

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

Installation des composants Python OpenCL

apt-get install python-pyopencl python-pyopencl-doc

Vérification du fonctionnement

 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.

Récupération de la dernière version :

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

Conversion des RPM en DEB

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

Installation des paquets

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

Historique

developpement/activites/integration/xeonphi4jessie.txt · Dernière modification: 2015/01/07 10:04 (modification externe)