Compare commits
9 commits
4f2f24fe7e
...
a619a2142e
Author | SHA1 | Date | |
---|---|---|---|
a619a2142e | |||
643dc6e4fe | |||
a9a59ba1ea | |||
ba9fc9efee | |||
be2826b2ff | |||
da998f0f30 | |||
87b06c9fc6 | |||
f0d2d6ece0 | |||
03e18ac7e4 |
19 changed files with 2931 additions and 99 deletions
|
@ -176,3 +176,66 @@ Selon le protocol, il est également possible d'avoir des bits de 'stuffing' alt
|
||||||
|
|
||||||
> Note :
|
> Note :
|
||||||
> Le 'stuffing' peut servir de synchronisation d'horloge car il assure une alternance dans le signal.
|
> Le 'stuffing' peut servir de synchronisation d'horloge car il assure une alternance dans le signal.
|
||||||
|
|
||||||
|
## transmission des messages
|
||||||
|
|
||||||
|
Il est possible d'interfacer entre plusieurs bus grâce à un controlleur.
|
||||||
|
- exemple : VAN 1 -> CAN -> VAN 2
|
||||||
|
|
||||||
|
Les IDs doivent être traduits d'une manière cohérente aux deux protocoles interfaçés.
|
||||||
|
|
||||||
|
## Réseaux terrain
|
||||||
|
|
||||||
|
Les réseaux terrain permettent l'interconnexion entre plusieurs entités d'un même système.
|
||||||
|
|
||||||
|
Cette communication se déroule sur une zone limitée set sur laquelle on désire une réduction maximale de la longueur des liaisons entre les différents éléments grace à un médium commun den transmission.
|
||||||
|
|
||||||
|
Cette réduciton est liée à une volonté de sécurité (sur des automates d'usine par exemple).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
L'utilisateur ne se soucie pas du chemin suivi par les informations, de la conversion des formats type de l'interlocuteur ou bien du type de constructeur d'un élément.
|
||||||
|
Les tecnhiques de réseaux facilitent grandement l'insertion ou la suppression d'élements au sein d'un même système.
|
||||||
|
|
||||||
|
Un bus de terrein permet de transférer das la plupart des cas les informations de maniere séquentielle, ou bien par paquet de bits.
|
||||||
|
Il faut savoir que le bus de terrain permet un échange de données qui serait difficile (voire impossibl) par un autre moyen.
|
||||||
|
|
||||||
|
Derrière ce concept technologique se cachent de réels protocoles de communications qui n'ont fait qu'évoluer depuis 15 ans.
|
||||||
|
|
||||||
|
Basés sur l'optimisation de place et de temps, on a vu apparaitre des controles-commandes de plus en plus perfectionnés.
|
||||||
|
Ces technologies ne cessent d'etre améliorées et sont de plus en plus utilisés pour des raisons de cout, de confort et de flexibilité.
|
||||||
|
|
||||||
|
### Le système OSI
|
||||||
|
|
||||||
|
Le multiplexage se fait selon les principes des couches du modèle OSI.
|
||||||
|
|
||||||
|
1. la couche physique
|
||||||
|
2. la couche de liaison
|
||||||
|
|
||||||
|
Les autres couches ne sont pas présentes dans une communication BUS.
|
||||||
|
|
||||||
|
### Temps réel
|
||||||
|
|
||||||
|
Un système est dit 'temps réel' lorsqu'il a besoin de s'exécuter en un temps maximal pour assurer sa fiabilité / intégrité.
|
||||||
|
|
||||||
|
Ce qui ressort est la notion de synchronisation entre le traitement de l'information et la génération issue du monde extérieur.
|
||||||
|
En effet, ce qui prete souvent à confusion est le temps de réponse de la macjine par rapport au temps effectif qui s'écoule par l'environnement.
|
||||||
|
Naturellement, on pense à des ordres de grandeurs infinitésimale, de l'ordre du millième de secondes.
|
||||||
|
|
||||||
|
Deux types de systèmes :
|
||||||
|
|
||||||
|
- Transactionnel, ou 'temps réel mou'
|
||||||
|
- le système tolère des dépassements et les traitera comme des exception potentiellement récupérables. Cela ne déstabilisera par nécessairement le système.
|
||||||
|
|
||||||
|
- Commande, ou 'temps réel dur'
|
||||||
|
- Les invariances du système dépendent du respect de la temporalité du programme, et un dépassement sera perçu comme une erreur fatale.
|
||||||
|
- Nous cherchons à concevoir des systèmes déterministes et prévisible.
|
||||||
|
|
||||||
|
Différentes urgences vont devoir être gérées et priorisés (maintient de la synchronicité du BUS, attentes I/O, gestion d'erreurs)
|
||||||
|
|
||||||
|
Synchronisation des orloges :
|
||||||
|
|
||||||
|
- Différents calculateurs ne produirons pas les données à un débit égal. Mais la vitesse d'une transmission entre deux controleurs doit être unifiée / synchronisée.
|
||||||
|
- La vitesse de transfert dépends donc de la distance, mais aussi de la fréquence des horloges des partis.
|
||||||
|
- La synchronisation se fait au début du flux, mais elle doit également se faire en cas de resynchronisation en plein transfert de message.
|
||||||
|
|
||||||
|
|
98
bus/init.md
98
bus/init.md
|
@ -1,98 +0,0 @@
|
||||||
# Multiplexage
|
|
||||||
|
|
||||||
## Pourquoi ?
|
|
||||||
|
|
||||||
Machines à plusieurs objectifs.
|
|
||||||
|
|
||||||
- sécurisation
|
|
||||||
- réduction de consomation
|
|
||||||
- confort de conduite
|
|
||||||
|
|
||||||
Grand nombre de périphériques à connecter.
|
|
||||||
|
|
||||||
### Conventionnalité : une connection par liaison nécessaire :
|
|
||||||
|
|
||||||
```
|
|
||||||
+---+ +---+
|
|
||||||
| A |---| B |
|
|
||||||
| |-+ | |
|
|
||||||
+---+ | +---+
|
|
||||||
| |
|
|
||||||
| +---+
|
|
||||||
+-| C |
|
|
||||||
+---+
|
|
||||||
```
|
|
||||||
|
|
||||||
- Nombre de connections exponentelle.
|
|
||||||
- Difficile à mettre à jour.
|
|
||||||
|
|
||||||
### Multiplexage : une connection commune en 'réseau'.
|
|
||||||
|
|
||||||
```
|
|
||||||
+---+ +---+
|
|
||||||
| A |-+-| B |
|
|
||||||
+---+ | +---+
|
|
||||||
|
|
|
||||||
| +---+
|
|
||||||
+-| C |
|
|
||||||
+---+
|
|
||||||
```
|
|
||||||
|
|
||||||
- Nombre de connections linéaire.
|
|
||||||
- Disponibilité de l'information.
|
|
||||||
|
|
||||||
## Avantages
|
|
||||||
|
|
||||||
- moins de capteurs et de nombres de liaisons
|
|
||||||
- le poids et les couts diminuent
|
|
||||||
- extensibilité avec un cout minimal
|
|
||||||
- reconnu par une norme iso de fiabilité
|
|
||||||
|
|
||||||
## Principes
|
|
||||||
|
|
||||||
- un capteur par donnée nécessaire
|
|
||||||
- échange de donnée sur un cannal global.
|
|
||||||
|
|
||||||
### Détail
|
|
||||||
|
|
||||||
- Un réseau unifié
|
|
||||||
- Structuration des trames
|
|
||||||
- Synchronisation des horloges
|
|
||||||
- Arbitrage, priorisation de l'accès au Bus
|
|
||||||
|
|
||||||
## Architecture en couches
|
|
||||||
|
|
||||||
### étage d'entrée
|
|
||||||
|
|
||||||
Interface avec les capteurs
|
|
||||||
|
|
||||||
### étage de calcul
|
|
||||||
|
|
||||||
Le microprocesseur
|
|
||||||
|
|
||||||
- contient possiblement des mémoires
|
|
||||||
|
|
||||||
### étage de sortie
|
|
||||||
|
|
||||||
Interface avec les actionneurs
|
|
||||||
|
|
||||||
## Architecture réseau
|
|
||||||
|
|
||||||
- maitre esclave
|
|
||||||
- multi-maitre
|
|
||||||
- mixte
|
|
||||||
|
|
||||||
## Protocole
|
|
||||||
|
|
||||||
- l'acheminement des trames
|
|
||||||
- synchronisation d'horloges
|
|
||||||
- deux trames peuvent être émise en même temps
|
|
||||||
- l'arbitrage détermine celle qui est transmise
|
|
||||||
- la seconde sera ré-émise ensuite pour ne pas perdre d'information
|
|
||||||
|
|
||||||
### Méthode CSMA
|
|
||||||
|
|
||||||
- chaque message a un ID, un ID faible donne une plus haute priorité
|
|
||||||
- un temps est réservé pour la lecture des messages à envoyer
|
|
||||||
- un hashset des IDs supperposés est écrit sur le BUS,
|
|
||||||
- l'ID le plus faible enverra son message au temps suivant
|
|
2
gpu/tp2/.gitignore
vendored
Normal file
2
gpu/tp2/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
bin/
|
||||||
|
*.zip
|
20
gpu/tp2/c/build.sh
Executable file
20
gpu/tp2/c/build.sh
Executable file
|
@ -0,0 +1,20 @@
|
||||||
|
#!/bin/sh
|
||||||
|
cd "$(dirname "$(realpath "$0")")"
|
||||||
|
set -e
|
||||||
|
|
||||||
|
TARGET="ex1.cu ex2.cu ex3.cu ex4.cu"
|
||||||
|
|
||||||
|
if [ $# -gt 0 ]
|
||||||
|
then TARGET=$1
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -fr bin
|
||||||
|
mkdir -p bin
|
||||||
|
|
||||||
|
for target in $TARGET
|
||||||
|
do nvcc src/$target -o bin/${target%.cu}.out
|
||||||
|
done
|
||||||
|
|
||||||
|
for target in $TARGET
|
||||||
|
do ./bin/${target%.cu}.out
|
||||||
|
done
|
72
gpu/tp2/c/src/Matrix.h
Normal file
72
gpu/tp2/c/src/Matrix.h
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#define CUDA_CHECK(code) { cuda_check((code), __FILE__, __LINE__); }
|
||||||
|
inline void cuda_check(cudaError_t code, const char *file, int line) {
|
||||||
|
if(code != cudaSuccess) {
|
||||||
|
std::cout << file << ':' << line << ": [CUDA ERROR] " << cudaGetErrorString(code) << std::endl;
|
||||||
|
std::abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace linalg {
|
||||||
|
|
||||||
|
//
|
||||||
|
// Generic matrix of type T (int, float, double...)
|
||||||
|
//
|
||||||
|
template<typename T>
|
||||||
|
class Matrix
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// construct matrix, allocate the 2D pitched memory on the device
|
||||||
|
__host__ Matrix(int rows, int cols);
|
||||||
|
|
||||||
|
// free allocated device memory
|
||||||
|
__host__ void free();
|
||||||
|
|
||||||
|
public:
|
||||||
|
// copy values from host std::vector to device Matrix
|
||||||
|
// values must be a vector of size rows x cols
|
||||||
|
// allocation is already done in the constructor
|
||||||
|
__host__ void to_cuda(const std::vector<T>& values);
|
||||||
|
|
||||||
|
// copy values from device Matrix to host std::vector
|
||||||
|
// values may not ne resized
|
||||||
|
__host__ void to_cpu(std::vector<T>& values) const;
|
||||||
|
|
||||||
|
public:
|
||||||
|
// accessor at row i and column j
|
||||||
|
__device__ const T& operator()(int i, int j) const;
|
||||||
|
__device__ T& operator()(int i, int j);
|
||||||
|
|
||||||
|
public:
|
||||||
|
__host__ Matrix operator + (const Matrix<T>& other) const;
|
||||||
|
__host__ Matrix operator - (const Matrix<T>& other) const;
|
||||||
|
__host__ Matrix operator * (const Matrix<T>& other) const;
|
||||||
|
__host__ Matrix operator / (const Matrix<T>& other) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
// apply binary functor f on all pairs of elements
|
||||||
|
// f must provide the following operator
|
||||||
|
//
|
||||||
|
// T operator()(T a, T b)
|
||||||
|
//
|
||||||
|
// template<typename BinaryFunctor>
|
||||||
|
// __host__ Matrix apply(const Matrix<T>& other, BinaryFunctor&& f) const;
|
||||||
|
|
||||||
|
public:
|
||||||
|
__host__ __device__ inline int rows() const {return m_rows;}
|
||||||
|
__host__ __device__ inline int cols() const {return m_cols;}
|
||||||
|
|
||||||
|
private:
|
||||||
|
T* m_data_ptr; // device pointer
|
||||||
|
int m_rows;
|
||||||
|
int m_cols;
|
||||||
|
size_t m_pitch;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace linalg
|
||||||
|
|
||||||
|
#include "Matrix.hpp"
|
99
gpu/tp2/c/src/Matrix.hpp
Normal file
99
gpu/tp2/c/src/Matrix.hpp
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
#include "Matrix.h"
|
||||||
|
|
||||||
|
namespace linalg {
|
||||||
|
|
||||||
|
namespace kernel {
|
||||||
|
|
||||||
|
//
|
||||||
|
// step 10
|
||||||
|
// CUDA kernel add
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// step 12
|
||||||
|
// CUDA kernel apply
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace kernel
|
||||||
|
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
__host__ Matrix<T>::Matrix(int rows, int cols) :
|
||||||
|
m_data_ptr(nullptr),
|
||||||
|
m_rows(rows),
|
||||||
|
m_cols(cols),
|
||||||
|
m_pitch(0)
|
||||||
|
{
|
||||||
|
// step 07
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
__host__ void Matrix<T>::free()
|
||||||
|
{
|
||||||
|
// step 07
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
__host__ void Matrix<T>::to_cuda(const std::vector<T>& values)
|
||||||
|
{
|
||||||
|
// step 08
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
__host__ void Matrix<T>::to_cpu(std::vector<T>& values) const
|
||||||
|
{
|
||||||
|
// step 08
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
__device__ const T& Matrix<T>::operator()(int i, int j) const
|
||||||
|
{
|
||||||
|
// step 09
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
__device__ T& Matrix<T>::operator()(int i, int j)
|
||||||
|
{
|
||||||
|
// step 09
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
__host__ Matrix<T> Matrix<T>::operator + (const Matrix<T>& other) const
|
||||||
|
{
|
||||||
|
// step 11
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
__host__ Matrix<T> Matrix<T>::operator - (const Matrix<T>& other) const
|
||||||
|
{
|
||||||
|
// step 12
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
__host__ Matrix<T> Matrix<T>::operator * (const Matrix<T>& other) const
|
||||||
|
{
|
||||||
|
// step 12
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
__host__ Matrix<T> Matrix<T>::operator / (const Matrix<T>& other) const
|
||||||
|
{
|
||||||
|
// step 12
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace linalg
|
78
gpu/tp2/c/src/ex1.cu
Normal file
78
gpu/tp2/c/src/ex1.cu
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
//
|
||||||
|
// example: CUDA_CHECK( cudaMalloc(dx, x, N*sizeof(int) );
|
||||||
|
//
|
||||||
|
#define CUDA_CHECK(code) { cuda_check((code), __FILE__, __LINE__); }
|
||||||
|
inline void cuda_check(cudaError_t code, const char *file, int line) {
|
||||||
|
if(code != cudaSuccess) {
|
||||||
|
std::cout << file << ':' << line << ": [CUDA ERROR] " << cudaGetErrorString(code) << std::endl;
|
||||||
|
std::abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// step 01
|
||||||
|
// return the linear index corresponding to the element at row i and column j
|
||||||
|
// in a matrix of size rows x cols, using row-major storage
|
||||||
|
//
|
||||||
|
__device__ int linear_index(int i, int j, int rows, int cols) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// step 02
|
||||||
|
// CUDA kernel add
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
constexpr int rows = 200;
|
||||||
|
constexpr int cols = 80;
|
||||||
|
int* x = (int*)malloc(rows*cols*sizeof(int));
|
||||||
|
int* y = (int*)malloc(rows*cols*sizeof(int));
|
||||||
|
for(int i = 0; i < rows*cols; ++i) {
|
||||||
|
x[i] = i;
|
||||||
|
y[i] = std::pow(-1,i) * i;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// step 03
|
||||||
|
//
|
||||||
|
int* dx;
|
||||||
|
int* dy;
|
||||||
|
// 1. allocate on device
|
||||||
|
|
||||||
|
// 2. copy from host to device
|
||||||
|
|
||||||
|
// 3. launch CUDA kernel
|
||||||
|
// const dim3 threads_per_bloc{32,32,1};
|
||||||
|
|
||||||
|
// 4. copy result from device to host
|
||||||
|
|
||||||
|
// 5. free device memory
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// checking results
|
||||||
|
bool ok = true;
|
||||||
|
for(int i = 0; i < rows*cols; ++i) {
|
||||||
|
const int expected_result = std::pow(-1,i) * i + i;
|
||||||
|
if(y[i] != expected_result) {
|
||||||
|
std::cout << "Failure" << std::endl;
|
||||||
|
std::cout << "Result at index i="
|
||||||
|
<< i << ": expected "
|
||||||
|
<< std::pow(-1,i) * i << '+' << i << '=' << expected_result << ", got " << y[i] << std::endl;
|
||||||
|
ok = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(ok) std::cout << "Success" << std::endl;
|
||||||
|
|
||||||
|
free(x);
|
||||||
|
free(y);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
80
gpu/tp2/c/src/ex2.cu
Normal file
80
gpu/tp2/c/src/ex2.cu
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
//
|
||||||
|
// example: CUDA_CHECK( cudaMalloc(dx, x, N*sizeof(int) );
|
||||||
|
//
|
||||||
|
#define CUDA_CHECK(code) { cuda_check((code), __FILE__, __LINE__); }
|
||||||
|
inline void cuda_check(cudaError_t code, const char *file, int line) {
|
||||||
|
if(code != cudaSuccess) {
|
||||||
|
std::cout << file << ':' << line << ": [CUDA ERROR] " << cudaGetErrorString(code) << std::endl;
|
||||||
|
std::abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// step 04
|
||||||
|
// return a pointer to the value at row i and column j from base_address
|
||||||
|
// with pitch in bytes
|
||||||
|
//
|
||||||
|
__device__ inline int* get_ptr(int* base_address, int i, int j, size_t pitch) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// step 05
|
||||||
|
// CUDA kernel add
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
constexpr int rows = 200;
|
||||||
|
constexpr int cols = 80;
|
||||||
|
int* x = (int*)malloc(rows*cols*sizeof(int));
|
||||||
|
int* y = (int*)malloc(rows*cols*sizeof(int));
|
||||||
|
for(int i = 0; i < rows*cols; ++i) {
|
||||||
|
x[i] = i;
|
||||||
|
y[i] = std::pow(-1,i) * i;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// step 06
|
||||||
|
//
|
||||||
|
int* dx;
|
||||||
|
int* dy;
|
||||||
|
size_t pitch;
|
||||||
|
// 1. allocate on device
|
||||||
|
|
||||||
|
// 2. copy from host to device
|
||||||
|
|
||||||
|
// 3. launch CUDA kernel
|
||||||
|
// const dim3 threads_per_bloc{32,32,1};
|
||||||
|
|
||||||
|
// 4. copy result from device to host
|
||||||
|
|
||||||
|
// 5. free device memory
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// checking results
|
||||||
|
bool ok = true;
|
||||||
|
for(int i = 0; i < rows*cols; ++i) {
|
||||||
|
const int expected_result = std::pow(-1,i) * i + i;
|
||||||
|
if(y[i] != expected_result) {
|
||||||
|
std::cout << "Failure" << std::endl;
|
||||||
|
std::cout << "Result at index i="
|
||||||
|
<< i << ": expected "
|
||||||
|
<< std::pow(-1,i) * i << '+' << i << '=' << expected_result << ", got " << y[i] << std::endl;
|
||||||
|
ok = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(ok) std::cout << "Success" << std::endl;
|
||||||
|
|
||||||
|
free(x);
|
||||||
|
free(y);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
148
gpu/tp2/c/src/ex3.cu
Normal file
148
gpu/tp2/c/src/ex3.cu
Normal file
|
@ -0,0 +1,148 @@
|
||||||
|
#include "Matrix.h"
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
const int rows = 4;
|
||||||
|
const int cols = 4;
|
||||||
|
// instantiate two matrices of integers on the device
|
||||||
|
linalg::Matrix<int> A(rows, cols);
|
||||||
|
linalg::Matrix<int> B(rows, cols);
|
||||||
|
// fill the two matrices
|
||||||
|
A.to_cuda({ 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16});
|
||||||
|
B.to_cuda({16,15,14,13,12,11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1});
|
||||||
|
|
||||||
|
// compute the sum
|
||||||
|
auto C = A + B;
|
||||||
|
|
||||||
|
// transfert the result on the host
|
||||||
|
std::vector<int> c_res;
|
||||||
|
C.to_cpu(c_res);
|
||||||
|
C.free();
|
||||||
|
|
||||||
|
// check results
|
||||||
|
const std::vector<int> c_expected{17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17};
|
||||||
|
if(c_res != c_expected) {
|
||||||
|
std::cout << __FILE__ << ":" << __LINE__ << ": Failure (+):" << std::endl;
|
||||||
|
std::cout << " expected: ";
|
||||||
|
for(int i : c_expected) std::cout << i << " ";
|
||||||
|
std::cout << std::endl;
|
||||||
|
std::cout << " got: ";
|
||||||
|
for(int i : c_res) std::cout << i << " ";
|
||||||
|
std::cout << std::endl;
|
||||||
|
} else {
|
||||||
|
std::cout << "Success" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// compute the difference
|
||||||
|
auto D = A - B;
|
||||||
|
|
||||||
|
// transfert the result on the host
|
||||||
|
std::vector<int> d_res;
|
||||||
|
D.to_cpu(d_res);
|
||||||
|
D.free();
|
||||||
|
|
||||||
|
// check results
|
||||||
|
const std::vector<int> d_expected{-15, -13, -11, -9, -7, -5, -3, -1, 1, 3, 5, 7, 9, 11, 13, 15};
|
||||||
|
if(d_res != d_expected) {
|
||||||
|
std::cout << __FILE__ << ":" << __LINE__ << ": Failure (-):" << std::endl;
|
||||||
|
std::cout << " expected: ";
|
||||||
|
for(int i : d_expected) std::cout << i << " ";
|
||||||
|
std::cout << std::endl;
|
||||||
|
std::cout << " got: ";
|
||||||
|
for(int i : d_res) std::cout << i << " ";
|
||||||
|
std::cout << std::endl;
|
||||||
|
} else {
|
||||||
|
std::cout << "Success" << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
{
|
||||||
|
const int rows = 89;
|
||||||
|
const int cols = 128;
|
||||||
|
linalg::Matrix<float> A(rows, cols);
|
||||||
|
linalg::Matrix<float> B(rows, cols);
|
||||||
|
std::vector<float> a_values(rows*cols);
|
||||||
|
std::vector<float> b_values(rows*cols);
|
||||||
|
for(int i = 0; i < rows*cols; ++i) {
|
||||||
|
a_values[i] = 1 + float(i) / 100;
|
||||||
|
b_values[i] = std::pow(-1, i) * float(i)/(rows*cols) * 100;
|
||||||
|
}
|
||||||
|
A.to_cuda(a_values);
|
||||||
|
B.to_cuda(b_values);
|
||||||
|
|
||||||
|
auto C = A + B;
|
||||||
|
auto D = A - B;
|
||||||
|
auto E = A * B;
|
||||||
|
auto F = A / B;
|
||||||
|
|
||||||
|
std::vector<float> c_values;
|
||||||
|
C.to_cpu(c_values);
|
||||||
|
std::vector<float> d_values;
|
||||||
|
D.to_cpu(d_values);
|
||||||
|
std::vector<float> e_values;
|
||||||
|
E.to_cpu(e_values);
|
||||||
|
std::vector<float> f_values;
|
||||||
|
F.to_cpu(f_values);
|
||||||
|
|
||||||
|
C.free();
|
||||||
|
D.free();
|
||||||
|
E.free();
|
||||||
|
F.free();
|
||||||
|
|
||||||
|
const float epsilon = 0.001;
|
||||||
|
bool ok = true;
|
||||||
|
for(int i = 0; i < rows*cols; ++i) {
|
||||||
|
const float diff = std::abs( c_values[i] - (a_values[i] + b_values[i]) );
|
||||||
|
if(diff > epsilon) {
|
||||||
|
std::cout << __FILE__ << ":" << __LINE__ << ": Failure (+):" << std::endl;
|
||||||
|
std::cout << " expected: " << a_values[i] + b_values[i] << std::endl;
|
||||||
|
std::cout << " got: " << c_values[i] << std::endl;
|
||||||
|
ok = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(ok) std::cout << "Success" << std::endl;
|
||||||
|
|
||||||
|
ok = true;
|
||||||
|
for(int i = 0; i < rows*cols; ++i) {
|
||||||
|
const float diff = std::abs( d_values[i] - (a_values[i] - b_values[i]) );
|
||||||
|
if(diff > epsilon) {
|
||||||
|
std::cout << __FILE__ << ":" << __LINE__ << ": Failure (-):" << std::endl;
|
||||||
|
std::cout << " expected: " << a_values[i] - b_values[i] << std::endl;
|
||||||
|
std::cout << " got: " << d_values[i] << std::endl;
|
||||||
|
ok = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(ok) std::cout << "Success" << std::endl;
|
||||||
|
|
||||||
|
ok = true;
|
||||||
|
for(int i = 0; i < rows*cols; ++i) {
|
||||||
|
const float diff = std::abs( e_values[i] - (a_values[i] * b_values[i]) );
|
||||||
|
if(diff > epsilon) {
|
||||||
|
std::cout << __FILE__ << ":" << __LINE__ << ": Failure (*):" << std::endl;
|
||||||
|
std::cout << " expected: " << a_values[i] * b_values[i] << std::endl;
|
||||||
|
std::cout << " got: " << e_values[i] << std::endl;
|
||||||
|
ok = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(ok) std::cout << "Success" << std::endl;
|
||||||
|
|
||||||
|
ok = true;
|
||||||
|
for(int i = 0; i < rows*cols; ++i) {
|
||||||
|
const float diff = std::abs( f_values[i] - (a_values[i] / b_values[i]) );
|
||||||
|
if(diff > epsilon) {
|
||||||
|
std::cout << __FILE__ << ":" << __LINE__ << ": Failure (/):" << std::endl;
|
||||||
|
std::cout << " expected: " << a_values[i] / b_values[i] << std::endl;
|
||||||
|
std::cout << " got: " << f_values[i] << std::endl;
|
||||||
|
ok = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(ok) std::cout << "Success" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
4
ia/tp2/.gitignore
vendored
Normal file
4
ia/tp2/.gitignore
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
/__pycache__
|
||||||
|
/.pytest_cache
|
||||||
|
/env
|
||||||
|
/*.zip
|
262
ia/tp2/main.py
Executable file
262
ia/tp2/main.py
Executable file
|
@ -0,0 +1,262 @@
|
||||||
|
#!/usr/bin/env -S python
|
||||||
|
|
||||||
|
import pandas
|
||||||
|
import numpy
|
||||||
|
import seaborn
|
||||||
|
import matplotlib.pyplot
|
||||||
|
import sklearn.model_selection
|
||||||
|
import sklearn.linear_model
|
||||||
|
import sklearn.ensemble
|
||||||
|
import sklearn.metrics
|
||||||
|
|
||||||
|
DATA_COLUMNS = [ "fixed acidity", "volatile acidity", "citric acid", "residual sugar", "chlorides", "free sulfur dioxide", "total sulfur dioxide", "density", "pH", "sulphates", "alcohol", "quality" ]
|
||||||
|
HAHA_FUNI_NUMBER = 42
|
||||||
|
|
||||||
|
def main():
|
||||||
|
wine_quality = q_01_01_load_data("./winequality-red.csv")
|
||||||
|
|
||||||
|
# q_01_02_print_raw_data(wine_quality)
|
||||||
|
#
|
||||||
|
# > __q_02_print_raw_data__
|
||||||
|
# > fixed acidity volatile acidity citric acid ... sulphates alcohol quality
|
||||||
|
# > 0 7.4 0.700 0.00 ... 0.56 9.4 5
|
||||||
|
# > 1 7.8 0.880 0.00 ... 0.68 9.8 5
|
||||||
|
# > ... ...
|
||||||
|
#
|
||||||
|
# note :
|
||||||
|
# - Les colomnes "citric acid" (2) et "quality" (11) ont des valeur discrètes, donc des indices de cathégories.
|
||||||
|
# - Les autres colomnes sont numériques.
|
||||||
|
|
||||||
|
# q_01_03_plot_raw_data(wine_quality)
|
||||||
|
#
|
||||||
|
# note :
|
||||||
|
# Aucune correllation n'est évidente.
|
||||||
|
|
||||||
|
|
||||||
|
(quality_categories, parameters) = q_02_01_split_set(wine_quality)
|
||||||
|
# print("quality_categories", quality_categories.shape, "parameters", parameters.shape)
|
||||||
|
#
|
||||||
|
# > quality_categories (1599, 1) parameters (1599, 11)
|
||||||
|
|
||||||
|
(training_set, validation_set) = q_02_02_model_sets(parameters, quality_categories)
|
||||||
|
# print("training_set", training_set.shape, "validation_set", validation_set.shape)
|
||||||
|
#
|
||||||
|
# > training_set (1199, 11) validation_set (400, 11)
|
||||||
|
|
||||||
|
linear_model = q_02_03_train_linear_model(*training_set)
|
||||||
|
linear_accuracy = q_02_04_evaluate_error(linear_model, *validation_set)
|
||||||
|
# print("linear_accuracy", linear_accuracy)
|
||||||
|
#
|
||||||
|
# > linear_accuracy 0.38830173868689244
|
||||||
|
|
||||||
|
# q_02_05_print_one_prediction(linear_model, training_set[0])
|
||||||
|
#
|
||||||
|
# > q_02_05_print_one_prediction 5.23381934012872
|
||||||
|
#
|
||||||
|
# note :
|
||||||
|
# Nous cherchons des valeurs discrètes pour procéder à une catégorisation, la nature de la prédiction est incorrecte.
|
||||||
|
|
||||||
|
|
||||||
|
forest_model = q_03_01_train_forest_model(*training_set)
|
||||||
|
forest_training_accuracy = q_03_02_evaluate_error(forest_model, *training_set)
|
||||||
|
forest_validation_accuracy = q_03_02_evaluate_error(forest_model, *validation_set)
|
||||||
|
# print("forest_training_accuracy", forest_training_accuracy, "forest_validation_accuracy", forest_validation_accuracy)
|
||||||
|
#
|
||||||
|
# > forest_training_accuracy 0.0 forest_validation_accuracy 0.42
|
||||||
|
#
|
||||||
|
# note :
|
||||||
|
# Le modèle semble sur-spécialisé pour le set d'entrainement.
|
||||||
|
|
||||||
|
confusion = q_03_03_confusion_matrix(forest_model, *validation_set)
|
||||||
|
# print("confusion", confusion)
|
||||||
|
#
|
||||||
|
# > confusion [[ 0 0 1 0 0 0]
|
||||||
|
# > [ 0 0 5 8 0 0]
|
||||||
|
# > [ 0 0 123 39 2 0]
|
||||||
|
# > [ 0 0 37 122 10 0]
|
||||||
|
# > [ 0 0 0 24 23 1]
|
||||||
|
# > [ 0 0 0 1 4 0]]
|
||||||
|
#
|
||||||
|
# note :
|
||||||
|
# Les occurences de classes fortement représentées statistiquement sont presque évaluées correctement.
|
||||||
|
# Cependant le modèle tend à classifier les valeurs peu représentées dans les catégories fortement représentées.
|
||||||
|
|
||||||
|
|
||||||
|
training_alternate_expects_set = q_04_01_reclassify_expects(training_set[1])
|
||||||
|
validation_alternate_expects_set = q_04_01_reclassify_expects(validation_set[1])
|
||||||
|
alt_forest_model = q_04_02_train_forest_model(training_set[0], training_alternate_expects_set)
|
||||||
|
alt_forest_training_accuracy = q_04_03_evaluate_error(alt_forest_model, training_set[0], training_alternate_expects_set)
|
||||||
|
alt_forest_validation_accuracy = q_04_03_evaluate_error(alt_forest_model, validation_set[0], validation_alternate_expects_set)
|
||||||
|
# print("alt_forest_training_accuracy", alt_forest_training_accuracy, "alt_forest_validation_accuracy", alt_forest_validation_accuracy)
|
||||||
|
#
|
||||||
|
# > alt_forest_training_accuracy 0.0 alt_forest_validation_accuracy 0.085
|
||||||
|
#
|
||||||
|
# note :
|
||||||
|
# Le modèle obtient un bien meilleur score pour une tache plus simple et un set avec une représentation plus uniforme.
|
||||||
|
# Le modèle ne souffre pas de sur-spécialisation.
|
||||||
|
|
||||||
|
alt_confusion = q_04_04_confusion_matrix(alt_forest_model, validation_set[0], validation_alternate_expects_set)
|
||||||
|
# print("alt_confusion", alt_confusion)
|
||||||
|
#
|
||||||
|
# > alt_confusion [[338 9]
|
||||||
|
# > [ 25 28]]
|
||||||
|
#
|
||||||
|
# Tip top.
|
||||||
|
|
||||||
|
|
||||||
|
q_05_01_read_doc()
|
||||||
|
search_grid = q_05_02_make_search_grid(alt_forest_model)
|
||||||
|
q_05_03_k()
|
||||||
|
# best_estimator = q_05_04_get_best_params(search_grid, training_set[0], training_alternate_expects_set)
|
||||||
|
# print("best_estimator", best_estimator)
|
||||||
|
#
|
||||||
|
# > best_estimator RandomForestClassifier(bootstrap=False, min_samples_leaf=2, n_estimators=200, random_state=42)
|
||||||
|
|
||||||
|
# définition alternative pour 'best_estimator'
|
||||||
|
best_estimator = sklearn.ensemble.RandomForestClassifier(bootstrap=False, min_samples_leaf=2, n_estimators=200, random_state=42).fit(training_set[0], training_alternate_expects_set)
|
||||||
|
best_estimator_accuracy = q_05_05_evaluate_error(best_estimator, validation_set[0], validation_alternate_expects_set)
|
||||||
|
# print("best_estimator_accuracy", best_estimator_accuracy)
|
||||||
|
#
|
||||||
|
# > best_estimator_accuracy 0.0975
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def q_01_01_load_data(path: str):
|
||||||
|
return pandas.read_csv(path, sep=';')
|
||||||
|
|
||||||
|
def q_01_02_print_raw_data(data: pandas.DataFrame):
|
||||||
|
print("__q_02_print_raw_data__\n", data)
|
||||||
|
|
||||||
|
def q_01_03_plot_raw_data(data: pandas.DataFrame):
|
||||||
|
seaborn.pairplot(data)
|
||||||
|
matplotlib.pyplot.show()
|
||||||
|
|
||||||
|
|
||||||
|
def q_02_01_split_set(data: pandas.DataFrame):
|
||||||
|
quality_categories = data["quality"]
|
||||||
|
parameters_columns = [ name for name in DATA_COLUMNS if name != "quality" ]
|
||||||
|
parameters = data[parameters_columns]
|
||||||
|
return (quality_categories, parameters)
|
||||||
|
|
||||||
|
|
||||||
|
def q_02_02_model_sets(parameters: pandas.Series, expects: pandas.Series):
|
||||||
|
(
|
||||||
|
training_parameters_set, validation_parameters_set,
|
||||||
|
training_expects_set, validation_expects_set
|
||||||
|
) = sklearn.model_selection.train_test_split(parameters, expects, random_state=HAHA_FUNI_NUMBER)
|
||||||
|
|
||||||
|
assert type(training_parameters_set) is pandas.DataFrame
|
||||||
|
assert type(validation_parameters_set) is pandas.DataFrame
|
||||||
|
assert type(training_expects_set) is pandas.Series
|
||||||
|
assert type(validation_expects_set) is pandas.Series
|
||||||
|
return ((training_parameters_set, training_expects_set), (validation_parameters_set, validation_expects_set))
|
||||||
|
|
||||||
|
def q_02_03_train_linear_model(training_parameters_set: pandas.DataFrame, training_expects_set: pandas.Series):
|
||||||
|
model = sklearn.linear_model.LinearRegression()
|
||||||
|
model.fit(training_parameters_set, training_expects_set)
|
||||||
|
return model
|
||||||
|
|
||||||
|
def q_02_04_evaluate_error(
|
||||||
|
model: sklearn.linear_model.LinearRegression,
|
||||||
|
validation_parameters_set: pandas.DataFrame,
|
||||||
|
validation_expects_set: pandas.Series
|
||||||
|
):
|
||||||
|
predictions = model.predict(validation_parameters_set)
|
||||||
|
error = sklearn.metrics.mean_squared_error(validation_expects_set, predictions)
|
||||||
|
return error
|
||||||
|
|
||||||
|
def q_02_05_print_one_prediction(model: sklearn.linear_model.LinearRegression, parameter_set: pandas.DataFrame):
|
||||||
|
parameters = parameter_set.head(1)
|
||||||
|
[prediction, *_] = model.predict(parameters)
|
||||||
|
print("q_02_05_print_one_prediction", prediction)
|
||||||
|
|
||||||
|
|
||||||
|
def q_03_01_train_forest_model(training_parameters_set: pandas.DataFrame, training_expects_set: pandas.Series):
|
||||||
|
model = sklearn.ensemble.RandomForestClassifier(random_state=HAHA_FUNI_NUMBER)
|
||||||
|
model.fit(training_parameters_set, training_expects_set)
|
||||||
|
return model
|
||||||
|
|
||||||
|
def q_03_02_evaluate_error(
|
||||||
|
model: sklearn.ensemble.RandomForestClassifier,
|
||||||
|
validation_parameters_set: pandas.DataFrame,
|
||||||
|
validation_expects_set: pandas.Series
|
||||||
|
):
|
||||||
|
predictions = model.predict(validation_parameters_set)
|
||||||
|
error = sklearn.metrics.mean_squared_error(validation_expects_set, predictions)
|
||||||
|
return error
|
||||||
|
|
||||||
|
def q_03_03_confusion_matrix(
|
||||||
|
model: sklearn.ensemble.RandomForestClassifier,
|
||||||
|
validation_parameters_set: pandas.DataFrame,
|
||||||
|
validation_expects_set: pandas.Series
|
||||||
|
):
|
||||||
|
predictions = model.predict(validation_parameters_set)
|
||||||
|
confusion = sklearn.metrics.confusion_matrix(validation_expects_set, predictions)
|
||||||
|
return confusion
|
||||||
|
|
||||||
|
|
||||||
|
def q_04_01_reclassify_expects(quality_series: pandas.Series):
|
||||||
|
QUALITY_THRESHOLD = 7
|
||||||
|
high_quality_series = quality_series.map(lambda quality: 1 if quality >= QUALITY_THRESHOLD else 0)
|
||||||
|
return high_quality_series
|
||||||
|
|
||||||
|
def q_04_02_train_forest_model(training_parameters_set: pandas.DataFrame, training_expects_set: pandas.Series):
|
||||||
|
model = sklearn.ensemble.RandomForestClassifier(random_state=HAHA_FUNI_NUMBER)
|
||||||
|
model.fit(training_parameters_set, training_expects_set)
|
||||||
|
return model
|
||||||
|
|
||||||
|
def q_04_03_evaluate_error(
|
||||||
|
model: sklearn.ensemble.RandomForestClassifier,
|
||||||
|
validation_parameters_set: pandas.DataFrame,
|
||||||
|
validation_expects_set: pandas.Series
|
||||||
|
):
|
||||||
|
predictions = model.predict(validation_parameters_set)
|
||||||
|
error = sklearn.metrics.mean_squared_error(validation_expects_set, predictions)
|
||||||
|
return error
|
||||||
|
|
||||||
|
def q_04_04_confusion_matrix(
|
||||||
|
model: sklearn.ensemble.RandomForestClassifier,
|
||||||
|
validation_parameters_set: pandas.DataFrame,
|
||||||
|
validation_expects_set: pandas.Series
|
||||||
|
):
|
||||||
|
predictions = model.predict(validation_parameters_set)
|
||||||
|
confusion = sklearn.metrics.confusion_matrix(validation_expects_set, predictions)
|
||||||
|
return confusion
|
||||||
|
|
||||||
|
|
||||||
|
def q_05_01_read_doc():
|
||||||
|
pass
|
||||||
|
|
||||||
|
def q_05_02_make_search_grid(base_model: sklearn.ensemble.RandomForestClassifier):
|
||||||
|
param_grid = {
|
||||||
|
"n_estimators": [100, 200, 300],
|
||||||
|
"max_depth": [None, 10, 20, 30],
|
||||||
|
"min_samples_split": [2, 5, 10],
|
||||||
|
"min_samples_leaf": [1, 2, 4],
|
||||||
|
"bootstrap": [True, False]
|
||||||
|
}
|
||||||
|
grid_search = sklearn.model_selection.GridSearchCV(base_model, param_grid, n_jobs=-1)
|
||||||
|
return grid_search
|
||||||
|
|
||||||
|
def q_05_03_k():
|
||||||
|
pass
|
||||||
|
|
||||||
|
def q_05_04_get_best_params(
|
||||||
|
grid_search: sklearn.model_selection.GridSearchCV,
|
||||||
|
training_parameters_set: pandas.DataFrame,
|
||||||
|
training_expects_set: pandas.Series
|
||||||
|
):
|
||||||
|
grid_search.fit(training_parameters_set, training_expects_set)
|
||||||
|
return grid_search.best_estimator_
|
||||||
|
|
||||||
|
def q_05_05_evaluate_error(
|
||||||
|
model: sklearn.ensemble.RandomForestClassifier,
|
||||||
|
validation_parameters_set: pandas.DataFrame,
|
||||||
|
validation_expects_set: pandas.Series
|
||||||
|
):
|
||||||
|
predictions = model.predict(validation_parameters_set)
|
||||||
|
error = sklearn.metrics.mean_squared_error(validation_expects_set, predictions)
|
||||||
|
return error
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__": main()
|
6
ia/tp2/requirements.txt
Normal file
6
ia/tp2/requirements.txt
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
pandas
|
||||||
|
numpy
|
||||||
|
seaborn
|
||||||
|
matplotlib
|
||||||
|
scikit-learn
|
||||||
|
PyQt5
|
1600
ia/tp2/winequality-red.csv
Normal file
1600
ia/tp2/winequality-red.csv
Normal file
File diff suppressed because it is too large
Load diff
103
os/01_init.md
Normal file
103
os/01_init.md
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
|
||||||
|
# Systèmes d'exploitation et Programmation temps-réel
|
||||||
|
|
||||||
|
> Note :
|
||||||
|
> - 12 h de cours
|
||||||
|
> - 10 h de TP
|
||||||
|
>
|
||||||
|
> 1. Introduction
|
||||||
|
> 2. Système d'exploitation et temps réel
|
||||||
|
> 3. Interuptions de processus
|
||||||
|
> 4. Outils de synchronisation et de communication des taches
|
||||||
|
> 5. Gestion de la mémoire
|
||||||
|
> 6. Ordonancement et gestion des taches, ordonancement temps réel
|
||||||
|
|
||||||
|
# Introduction
|
||||||
|
|
||||||
|
Des domaines d'application :
|
||||||
|
|
||||||
|
- automatisme
|
||||||
|
- avionique
|
||||||
|
- robotique
|
||||||
|
- villes intelligentes
|
||||||
|
- armement
|
||||||
|
|
||||||
|
- multimédia
|
||||||
|
- télécommunications
|
||||||
|
- e-commerce
|
||||||
|
- santé, implants
|
||||||
|
- domotique
|
||||||
|
|
||||||
|
## Exemple d'une voiture moderne
|
||||||
|
|
||||||
|
- 30 calculateurs
|
||||||
|
- 100 capteurs
|
||||||
|
- 1 000 000 lignes de code
|
||||||
|
|
||||||
|
## Définitions
|
||||||
|
|
||||||
|
Un système embarqué
|
||||||
|
- dispositif matériel comportant des parties logicielles
|
||||||
|
- utilisé pour controler et agir sur son environnement
|
||||||
|
- observe les variations de son environnement grace à des capteurs et agir sur lui grace à des actionneurs
|
||||||
|
|
||||||
|
contraintes physiques peuvent s'appliquer :
|
||||||
|
- résistance à des températures extrêmes
|
||||||
|
- résistance aux champs magnétiques
|
||||||
|
- résistance aux vibrations
|
||||||
|
|
||||||
|
Les termes de système embarqué désignent aussi bien le matériel que le logiciel utilisé.
|
||||||
|
Pour concevoir un système embarqué, il faut généralement combiner des compétences en électronique, en informatique industrielle et en automatique.
|
||||||
|
|
||||||
|
Un système embarqué est un système informatisé spécialisé qui constitue une partie intégrante d'un système plus large ou une machine.
|
||||||
|
Typiquement, c'est un système sur un seul processeur et dont les programmes sont stockés en mémoire non volatile.
|
||||||
|
|
||||||
|
## Histoire
|
||||||
|
|
||||||
|
- Le premier système à être embarqué a été le système de guidage de la mission apolo en 1967.
|
||||||
|
- Le premier processeur spécialisé pour l'embarqué, le Intel 4004 est sorti en 1971.
|
||||||
|
- Le premier appareil commercial piloté par ordinateur était l'airbus A320 en 1984.
|
||||||
|
- Le premier métro autonome a été le métro de lile en 1983.
|
||||||
|
- L'émergeance des IoT en 1999.
|
||||||
|
- Premier smartphone tactile correctement commercialisé en 2007 (après philips).
|
||||||
|
- Premières attaques d'envergures par bot internet en 2016.
|
||||||
|
|
||||||
|
## Caractéristiques
|
||||||
|
|
||||||
|
- Encombrement de l'équipement (mémoire limitée pas de disque en général)
|
||||||
|
- Consommation d'énergie et autonomie (batterie)
|
||||||
|
- Mobilité
|
||||||
|
- Communication
|
||||||
|
- Contraintes de sécurité
|
||||||
|
- Contraintes de temps réel
|
||||||
|
- Ergonomie
|
||||||
|
- Impacts : éthiques et sociétaux
|
||||||
|
- coût de produits en relation avec le secteur cible
|
||||||
|
|
||||||
|
- intégration assive de composants embarqués répartis pour batir la société de l'information
|
||||||
|
- téléphones cellulaires
|
||||||
|
- tablettes
|
||||||
|
- automobile
|
||||||
|
- appareils médicaux
|
||||||
|
- photo/vidéo/hifi
|
||||||
|
- électroménager
|
||||||
|
- avionique
|
||||||
|
- spacial
|
||||||
|
- jouets
|
||||||
|
|
||||||
|
- outils théorques pratiques our l'intégration permettantn de prendre en compte tous ces critères
|
||||||
|
|
||||||
|
- construire des systèmes de fonctionnalité et qualité déterminée et agarantie, à cout acceptable.
|
||||||
|
|
||||||
|
|
||||||
|
## Considérations
|
||||||
|
|
||||||
|
- Techniqeus : conception conjointe
|
||||||
|
- économiques : optimisation par rapport au marché, entre cout, qualité et spécialisation
|
||||||
|
- multi compétence : combinaison de compétences en logiciel, controle, réseaux, ingénierie en électronique, ihm, automatique, médecine, mécanique
|
||||||
|
|
||||||
|
## Problématiques
|
||||||
|
|
||||||
|
- Hétérogénéité : Construire des systèmes complexes par intégration de composants hétérogènes
|
||||||
|
- Complexité : L'effort de développement augmente exonsentiellement avec le nombre de composantsi intégrés, d'où la nécessité de remplacer les méthodes de validation postérieure par des méthodes de validation incrémentale.
|
||||||
|
- Intelligence : Moyen d'améliorer la qualité de systèmes : autodiagnostic, auto configuration, adaptabilité à l'environnement, évaluation des risques.
|
|
@ -8,7 +8,7 @@ on utilise une onde qui est modulée avec le signal d'entrée dans le but de tra
|
||||||
|
|
||||||
+-----+ +-----+ +--------------+ +--------------+ +-----+ +-----+
|
+-----+ +-----+ +--------------+ +--------------+ +-----+ +-----+
|
||||||
| DTE |--| DCE |--| Modulateur & |. . . .| Modulateur & |--| DCE |--| DTE |
|
| DTE |--| DCE |--| Modulateur & |. . . .| Modulateur & |--| DCE |--| DTE |
|
||||||
+-----+ +-----+ | Démodulateur | | Démodulateur | +-----+ +-----+
|
+-----+ +-----+ | Démodulateur | canal | Démodulateur | +-----+ +-----+
|
||||||
+--------------+ +--------------+
|
+--------------+ +--------------+
|
||||||
|
|
||||||
```
|
```
|
||||||
|
@ -387,3 +387,6 @@ Exemple : USB, token-ring 802.5 (IBM).
|
||||||
Une station qui veut émettre écoute le medium.
|
Une station qui veut émettre écoute le medium.
|
||||||
- si celui-ci est libre, elle commence sa transmission, tout en vérifiant qu'auune autre station n'est en train d'émettre.
|
- si celui-ci est libre, elle commence sa transmission, tout en vérifiant qu'auune autre station n'est en train d'émettre.
|
||||||
- en cas de collision, les stations interromptent leur communication et attendent un délai aléatoire (rng back-off) puis la première ayant passé ce délai peut réémettre.
|
- en cas de collision, les stations interromptent leur communication et attendent un délai aléatoire (rng back-off) puis la première ayant passé ce délai peut réémettre.
|
||||||
|
|
||||||
|
Une analogie serait la colision dans une discussion entre humain :
|
||||||
|
- lorsque deux personnes se mettent à parler simultanément, ils se coupent et un des deux, chois au hasard, reprends.
|
||||||
|
|
327
reseau/03_net.md
Normal file
327
reseau/03_net.md
Normal file
|
@ -0,0 +1,327 @@
|
||||||
|
# Detection des collisions
|
||||||
|
|
||||||
|
Influende du temps de propagation.
|
||||||
|
|
||||||
|
```
|
||||||
|
Postes : A B C D E
|
||||||
|
*---*---*---*---*
|
||||||
|
. . . . .
|
||||||
|
T0 : ####.___.___.___.
|
||||||
|
. . . . .
|
||||||
|
T0+x : .___.####___._xxx
|
||||||
|
. . . . .
|
||||||
|
T0+y : .___.__####_xxx_.
|
||||||
|
. . . . .
|
||||||
|
T0+z : .___.____#x#x___.
|
||||||
|
. . . . .
|
||||||
|
```
|
||||||
|
|
||||||
|
à T0+z, la collision à lieu, A et E ont fini d'émettre et n'ont pas détecté la collision,
|
||||||
|
elles pensent pouvoir continuer à envoyer des trames sur le médium.
|
||||||
|
|
||||||
|
## Solution : slot-time
|
||||||
|
|
||||||
|
Pour éviter ce genre de collision, nous introduisons un délai avant chaque nouvelle transmission
|
||||||
|
pour s'assurer que l'information ait pu rejoindre tout le réseau avant d'émettre à nouveau.
|
||||||
|
|
||||||
|
Ce délai (slot-time) est généralement choisi à deux fois le temps de parcours de l'information sur tout le médium.
|
||||||
|
|
||||||
|
## Taille minimum d'une trame
|
||||||
|
|
||||||
|
Pour que l'on puisse détecter la collision, il faut que la station émettrice
|
||||||
|
soit toujours en train d'émettre lorsque la station la plus éloignée détecte l'émission.
|
||||||
|
|
||||||
|
Il faut donc que le temps d'émission d'un trame de longueur minimale soit supérieure au slot-time.
|
||||||
|
|
||||||
|
ex :
|
||||||
|
|
||||||
|
vitesse | taille mini | slot time
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
## Reprise après collision (binary exponential backoff)
|
||||||
|
|
||||||
|
Après la détection de la collision, la station doit retransmettre la même trame au bout d'un temps aléatoire dépassant le slot-time et du nombre de collisions successives déjà subies.
|
||||||
|
|
||||||
|
Le nompre de collisions successives est proportionnel au temps de retransmission.
|
||||||
|
|
||||||
|
Calcul du temps d'attente : M x slot Time
|
||||||
|
- 0 =< M < 2^k
|
||||||
|
- 0 < k < 2^(n-1).
|
||||||
|
- n est le nombre de collision par rapport à la station
|
||||||
|
|
||||||
|
|
||||||
|
- le nombre aléatoire est d'abord choisi dans [0, 1]
|
||||||
|
- puis dans [0, 3]
|
||||||
|
- puis [0, 7]
|
||||||
|
- ...
|
||||||
|
- à la 10e tentative, [0, 1023]
|
||||||
|
- à la 16e tentative, la transmission est abandonnée.
|
||||||
|
|
||||||
|
## Exemple
|
||||||
|
|
||||||
|
```
|
||||||
|
station : A B C D E
|
||||||
|
-*---*---*---*---*-
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
A et E subissent une collision :
|
||||||
|
|
||||||
|
### Cas 1
|
||||||
|
|
||||||
|
```
|
||||||
|
station : A E
|
||||||
|
-*---*-#####-*---*-
|
||||||
|
n : 1 1
|
||||||
|
k : [0,1] [0,1]
|
||||||
|
```
|
||||||
|
|
||||||
|
règles :
|
||||||
|
|
||||||
|
- k_A = 0 & k_E = 0 => collision
|
||||||
|
- k_A = 0 & k_E = 1 => pas de collision
|
||||||
|
- k_A = 1 & k_E = 0 => pas de collision
|
||||||
|
- k_A = 1 & k_E = 1 => pas de collision
|
||||||
|
|
||||||
|
valeurs de k
|
||||||
|
|
||||||
|
| A | E |
|
||||||
|
|---|---|
|
||||||
|
| 0 | 0 |
|
||||||
|
| 0 | 1 |
|
||||||
|
| 1 | 0 |
|
||||||
|
| 1 | 1 |
|
||||||
|
|
||||||
|
|
||||||
|
probabilité que A gagne : 1/4
|
||||||
|
probabilité que E gagne : 1/4
|
||||||
|
probabilité de collision à nouveau : 1/2
|
||||||
|
|
||||||
|
|
||||||
|
### Cas 2
|
||||||
|
|
||||||
|
```
|
||||||
|
station : A E
|
||||||
|
-*---*-#####-*---*-
|
||||||
|
n : 1 2
|
||||||
|
k : [0,1] [0,1,2,3]
|
||||||
|
```
|
||||||
|
|
||||||
|
valeurs de k
|
||||||
|
|
||||||
|
| A | E |
|
||||||
|
|---|---|
|
||||||
|
| 0 | 0 |
|
||||||
|
| 0 | 1 |
|
||||||
|
| 0 | 2 |
|
||||||
|
| 0 | 3 |
|
||||||
|
| 1 | 0 |
|
||||||
|
| 1 | 1 |
|
||||||
|
| 1 | 2 |
|
||||||
|
| 1 | 3 |
|
||||||
|
|
||||||
|
probabilité que A gagne : 5/8
|
||||||
|
probabilité que E gagne : 3/8
|
||||||
|
probabilité de collision à nouveau : 2/8 : 1/4
|
||||||
|
|
||||||
|
|
||||||
|
## Domaine de collision
|
||||||
|
|
||||||
|
- sur une topologie BUS, ou sur une topologie étoile constituée d'un HUB, le signal ethernet est ...
|
||||||
|
|
||||||
|
## Conclusion
|
||||||
|
|
||||||
|
le CSMA/CD n'est potentiellement pas adapté aux applications temps réel car non déterministe
|
||||||
|
|
||||||
|
|
||||||
|
# CSMA/CR (Collision .. with Collision Resolution)
|
||||||
|
|
||||||
|
dans la méthode CSMA/CR, la station utilises des fonctionnalité plus élabotées pour détecter une collision dès que possible.
|
||||||
|
|
||||||
|
Pour éviter les collisions en chaine, une station qui transmet une trame cesse d'émettre si elle recoit un bit différent du sien ;
|
||||||
|
- Une station qui émet un bit à 1 s'arrete si elle voir passer sur le support un bit à zéro.
|
||||||
|
- Une station qui recoit un bit identique à celui qu'elle a émis continue à émettre.
|
||||||
|
|
||||||
|
## Évolutions
|
||||||
|
|
||||||
|
| Port | mode |
|
||||||
|
|-------------|-------------|
|
||||||
|
| 10BT | Half-duplex |
|
||||||
|
| 100BASETx | Full-duplex |
|
||||||
|
| GB ethernet | Full-duplex |
|
||||||
|
|
||||||
|
### Switch
|
||||||
|
|
||||||
|
```
|
||||||
|
[ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ]
|
||||||
|
| | : | |
|
||||||
|
A B C D E
|
||||||
|
```
|
||||||
|
|
||||||
|
| Port | Mac |
|
||||||
|
|------|-----|
|
||||||
|
| 1 | A |
|
||||||
|
| 2 | B |
|
||||||
|
| 3 | C |
|
||||||
|
| 4 | D |
|
||||||
|
| 5 | E |
|
||||||
|
| 6 | |
|
||||||
|
|
||||||
|
chaque port du switch est un domaine de collision.
|
||||||
|
Le switch n'envoie le trafic que sur le port concerné.
|
||||||
|
|
||||||
|
# Trame ethernet
|
||||||
|
|
||||||
|
```
|
||||||
|
+-----------+-----+-----------+----------+------+----------+-----+-----+
|
||||||
|
| préambule | SFD | Dést. MAC | Src. MAC | Type | donnée | FCS | IPG |
|
||||||
|
+-----------+-----+-----------+----------+------+----------+-----+-----+
|
||||||
|
```
|
||||||
|
|
||||||
|
- préambule : 7 octets pour synchroniser les horloges du traget.
|
||||||
|
- Start Frame DElimiter : 1 octet qui indique au récepteur que le champ destination MAC démarre au prochain octet (synchro)
|
||||||
|
|
||||||
|
- Dest : 6 octets d'une addresse MAC
|
||||||
|
- Src : 6 octets d'une addresse MAC
|
||||||
|
|
||||||
|
## Domaine de Broadcast
|
||||||
|
|
||||||
|
Au contraire d'une communication unicast, il est possible d'adresser des trames de données
|
||||||
|
à tous les membred d'un même réseau uniquement par des adresses spécifiques.
|
||||||
|
|
||||||
|
Adresse MAC de diffusion générale est FF.FF.FF.FF.FF.FF
|
||||||
|
|
||||||
|
Un switch recevant une trame broadcast sur l'un de ses ports la diffusera sur tous les autres ports.
|
||||||
|
|
||||||
|
> note :
|
||||||
|
> un broadcast propagé dans un réseau contenant un cycle risque de se répéter à l'infini sur ce dernier.
|
||||||
|
> La solution est d'utiliser des switch implémentant le protocole spanning tree ;
|
||||||
|
> Qui réduit le nombre de récepteur des paquets broadcast à un réseau ne contenant pas de cycles entre les switchs.
|
||||||
|
|
||||||
|
Un routeur ne propage pas de broadcast car il interface deux réseaux différents, et un broadcast est adressé à un seul réseau.
|
||||||
|
|
||||||
|
## VLAN
|
||||||
|
|
||||||
|
un VLAN permet de, virtuellement, utiliser une seule liaison pour véhiculer deux réseaux séparés entre deux switchs qui le supportent.
|
||||||
|
|
||||||
|
```
|
||||||
|
[ switch A ] =trunk= [ switch B ]
|
||||||
|
| | | |
|
||||||
|
| | | |
|
||||||
|
[A][X] [B][Y]
|
||||||
|
/ \ / \
|
||||||
|
vlan1 vlan2 vlan1 vlan2
|
||||||
|
. . . .
|
||||||
|
. . . . . . . . . . . . .
|
||||||
|
. . . . . . . . . . .
|
||||||
|
```
|
||||||
|
|
||||||
|
Sur un switch, chaque VLAN est un domaine de broadcast.
|
||||||
|
|
||||||
|
Il est possible de joindre des VLAN avec un Routeur ;
|
||||||
|
mais il est préférable de contrôler l'accès entre deux VLAN
|
||||||
|
de responsabilités différentes avec un Routeur configuré en pare-feu.
|
||||||
|
|
||||||
|
> note : LAN est une norme 802
|
||||||
|
|
||||||
|
# Réseau WIFI
|
||||||
|
|
||||||
|
## Topologies
|
||||||
|
|
||||||
|
### Ad-Hoc / indépendant
|
||||||
|
|
||||||
|
```
|
||||||
|
A
|
||||||
|
| \
|
||||||
|
| \
|
||||||
|
B -- C
|
||||||
|
```
|
||||||
|
|
||||||
|
Les enteines de chaques membre peut communiquer dirrectement avec celles des autres membres du réseau.
|
||||||
|
|
||||||
|
### Infrastructure
|
||||||
|
|
||||||
|
```
|
||||||
|
A
|
||||||
|
|
|
||||||
|
B --o-- C
|
||||||
|
^\_ point d'accès
|
||||||
|
```
|
||||||
|
|
||||||
|
Les membres du réseau sont tous connectés à un point d'accès.
|
||||||
|
|
||||||
|
## Utilisation des ondes
|
||||||
|
|
||||||
|
Comme la bande FM, les réseaux wifi sont divisées en canaux se chevauchant.
|
||||||
|
|
||||||
|
```
|
||||||
|
-------------------------------------------------
|
||||||
|
......1...... ........6..... .......11.....
|
||||||
|
......2....... .......7...... .....12......
|
||||||
|
.......3....... ......8....... .....13.....
|
||||||
|
.......4....... ......9.......
|
||||||
|
........5....... ....10.......
|
||||||
|
|
||||||
|
^^^^^^^^^^^^^\_ 22 Mhz
|
||||||
|
```
|
||||||
|
|
||||||
|
- 13 bandes
|
||||||
|
- 3 bandes distinctes
|
||||||
|
- 22 Mhz de longueur
|
||||||
|
- 2.4 Ghz
|
||||||
|
|
||||||
|
## Codages
|
||||||
|
|
||||||
|
- DSSS
|
||||||
|
- FHSS
|
||||||
|
- OFDM : Orthogonal Frequency Division Multiplexing
|
||||||
|
- OFDMA : Orthogonal Frequency Division Multiple Access
|
||||||
|
|
||||||
|
## Les couches 802.11
|
||||||
|
|
||||||
|
- Liaison
|
||||||
|
- LLC : 802.2
|
||||||
|
- MAC : 802.11
|
||||||
|
- Physique
|
||||||
|
- FHSS
|
||||||
|
- ...
|
||||||
|
- OFDMA
|
||||||
|
|
||||||
|
## Standards
|
||||||
|
|
||||||
|
| Nom | 802.11b | 802.11a | 802.11g | 802.11n | 802.11ac | 802.11ax |
|
||||||
|
|---------------|----------|---------|---------|----------|----------|--------------|
|
||||||
|
| Fréquences | 2.4 Ghz | 5 | 2.4 | 2.4 ou 5 | 5 | 2.4 ou 5 |
|
||||||
|
| Transfert max | 11 Mb | 54 | 54 | 150 | 3.4 Gb | 10.5 |
|
||||||
|
| Modulation | DSSS | OFDM | OFDM | OFDM | OFDM | OFDL / OFDMA |
|
||||||
|
| Portée | 35-140 m | 35-120 | 35-140 | 50-250 | 20-300 | 20-300 |
|
||||||
|
| année | 1999 | 1999 | 2003 | 2009 | 2013 | 2021 |
|
||||||
|
|
||||||
|
## Méthode d'accès au médium
|
||||||
|
|
||||||
|
CSMA/CD inapproprié
|
||||||
|
- dificile d'écouter le médium lors de la transmission
|
||||||
|
- 2 stations peuvent être visibles l'une de l'autre
|
||||||
|
|
||||||
|
CSMA/CA méthode adapté
|
||||||
|
- carrier sense multiple access
|
||||||
|
- collision avoidance : évitement des collisions
|
||||||
|
- méthode par compétition
|
||||||
|
|
||||||
|
### principe du CSMA/CA
|
||||||
|
|
||||||
|
1. Une station souhaitant émettre écoute si le médium est libre.
|
||||||
|
- si c'est le cas, elle attend pendant un temps fixe (DIFS) + temps aléatoire.
|
||||||
|
2. si le média est toujours libre, alors elle émet.
|
||||||
|
|
||||||
|
acquittement (ack) après un silence SIFS.
|
||||||
|
|
||||||
|
```
|
||||||
|
------------------------------
|
||||||
|
Source : .###..........
|
||||||
|
Destination : .....#........
|
||||||
|
Autre station : .......###....
|
||||||
|
^\_ ACK
|
||||||
|
```
|
||||||
|
|
57
securite/02_securite_des_info.md
Normal file
57
securite/02_securite_des_info.md
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
## Qu est-ce qu'une info ?
|
||||||
|
|
||||||
|
- Actif essentiel
|
||||||
|
- Stockée sous différentes formes (num, materiel, intangigle)
|
||||||
|
- Transmise par différents moyens
|
||||||
|
- Dépendant des tech de l'information
|
||||||
|
|
||||||
|
La sécurité de l'information, c'est garantir la disponibilité de l'information ; par l'application et le management de mesures de sécurité appropriées.
|
||||||
|
|
||||||
|
|
||||||
|
## Un ensemble de mesures de sécurité applicables.
|
||||||
|
|
||||||
|
- Management du risque
|
||||||
|
- Gérées à l'aide d'un SMSi:
|
||||||
|
- Politiques, Processus, procédures, structures organisationelles, logiciels et matériels
|
||||||
|
- mesures spécifiées, mises en oeuvre, surveillées, réexaminées et améliorées si nécessaires.
|
||||||
|
|
||||||
|
## Objectifs
|
||||||
|
|
||||||
|
3 objectifs premiers :
|
||||||
|
|
||||||
|
- disponibilité
|
||||||
|
- intégrité
|
||||||
|
- confidentialités
|
||||||
|
|
||||||
|
5 objectifs accessoires :
|
||||||
|
|
||||||
|
- Traçabilité : Garder des traces des évènements et des action
|
||||||
|
- non-répudiation : Permet de prouver qu'une personne ou entité eest à l'origine d'un évènement ou d'une action
|
||||||
|
- imputabilité : Responsabilité d'une entité par rapport à ses actions et décisions
|
||||||
|
- opposabilité : Possibilité d'opposer une action à son auteur devant un juge
|
||||||
|
- irréfutabilité / irréfragabilité : Après être passé devant un juge
|
||||||
|
|
||||||
|
## RASCI (fruit du rasciste)
|
||||||
|
|
||||||
|
- Responsible
|
||||||
|
- Accountable
|
||||||
|
- Support
|
||||||
|
- Consulted
|
||||||
|
- Informed
|
||||||
|
|
||||||
|
## Quel management ?
|
||||||
|
|
||||||
|
- sécurité du système en conception et
|
||||||
|
- s'assurer que les résultats des travaux d'ingéneierie de conception et d'intégration sont d'un niveau de sécurité suffisant ; et fournir toutes les informations nécessaires.
|
||||||
|
- Métiers
|
||||||
|
- gestion de la sécurité et pilotage des projets de sécurité
|
||||||
|
- conception
|
||||||
|
|
||||||
|
- sécurité de l'entreprise régulière
|
||||||
|
- s'assurer que les activités menées sont réalisées de manière sécurisée
|
||||||
|
|
||||||
|
## Cyber sécurité embarqué
|
||||||
|
|
||||||
|
Différences
|
||||||
|
- production pour une série
|
||||||
|
|
2
securite/vm/.gitignore
vendored
Normal file
2
securite/vm/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
/labtainer-vbox.ova
|
||||||
|
/labtainer
|
4
securite/vm/setup.sh
Executable file
4
securite/vm/setup.sh
Executable file
|
@ -0,0 +1,4 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
wget -O ./labtainer-vbox.ova "https://nps.box.com/shared/static/dn636n6h2d556nwqezx5w6cfc4cfeacl.ova"
|
||||||
|
vboxmanage import --basefolder=./labtainer labtainer-vbox.ova
|
Loading…
Add table
Add a link
Reference in a new issue