Notions de codage de l'information.
Entiers non-signés et signés.
Codage en virgule fixe.
Codage en virgule flottante à la norme IEEE754.
Niveau DUT Génie Electrique et Informatique Industrielle.
Les nouveautés de C++11 : Ecrire du C++ ModerneMicrosoft
Le langage C++ a toujours la réputation d’un langage complexe, demandant une rigueur de tous les instants et qui peut en rebuter plus d’un. Mais avec l’arrivée de la nouvelle norme C++11 et de son intégration dans Visual Studio 11 (et intégration partielle dans Visual Studio 2010), elle permet comme le souligne Herb Sutter, d’écrire désormais du code "Clean, Safe and Fast", nous passons à l'ère du C++ moderne.
Articulé autour de C++ 11, cette session amène celui qui y assiste aux fondamentaux du développement logiciel : libraries, dépendances, TR1 et C++0X les fondations de C++ 11, runtime C alias CRT, runtime C++ alias STL, agilité en C++, ALM en C++, Windows 8 et C++, C++ et Windows 8 avec le nouveau modèle COM nommé WRL.
Comment développer un serveur métier en python/C++cppfrug
Quelles sont les problématiques d'interfaçage, les avantages/inconvénients des langages, la stratégie de code, etc. dans le développement d'un serveur métier ?
Notions de codage de l'information.
Entiers non-signés et signés.
Codage en virgule fixe.
Codage en virgule flottante à la norme IEEE754.
Niveau DUT Génie Electrique et Informatique Industrielle.
Les nouveautés de C++11 : Ecrire du C++ ModerneMicrosoft
Le langage C++ a toujours la réputation d’un langage complexe, demandant une rigueur de tous les instants et qui peut en rebuter plus d’un. Mais avec l’arrivée de la nouvelle norme C++11 et de son intégration dans Visual Studio 11 (et intégration partielle dans Visual Studio 2010), elle permet comme le souligne Herb Sutter, d’écrire désormais du code "Clean, Safe and Fast", nous passons à l'ère du C++ moderne.
Articulé autour de C++ 11, cette session amène celui qui y assiste aux fondamentaux du développement logiciel : libraries, dépendances, TR1 et C++0X les fondations de C++ 11, runtime C alias CRT, runtime C++ alias STL, agilité en C++, ALM en C++, Windows 8 et C++, C++ et Windows 8 avec le nouveau modèle COM nommé WRL.
Comment développer un serveur métier en python/C++cppfrug
Quelles sont les problématiques d'interfaçage, les avantages/inconvénients des langages, la stratégie de code, etc. dans le développement d'un serveur métier ?
Introduction à la programmation lock-free en C++11 au moyen des atomics. Présentation données par Cyril Comparon lors des rencontres C++ de Montpellier (novembre 2014).
Algorithmique et Programmation - informatique - débutantRidoinBahadi
introduction à l'algorithmique - algorithmique et programmation pour les tronc commun - informatique au lycée - introduction au développement informatique - comprendre l'algorithmique
Cours de théorie des langages, théorie de la compilation, techniques de compilations et paradigmes de programmation que je dispense aux Ingé 2 et 3 à l’École National des Sciences Géographiques de Paris.
Théorie des langages - 03 - Principes et paradigmesYann Caron
Cours de théorie des langages, théorie de la compilation, techniques de compilations et paradigmes de programmation que je dispense aux Ingé 2 et 3 à l’École National des Sciences Géographiques de Paris.
JAVA n'a plus de secret pour vous. Créer un projet, le passer de maven à graddle, enlever Spring, remplacer Guava par les API de Java 8 vous le faites sans même réfléchir. Vous avez essayé Python et la ce n'est plus la même affaire. Passé le "Hello World", quand il a fallu faire un projet de la vrai vie le courage vous a quitté. Cette conférence donnera les clefs pour bien débuter en Python quand on est un dev JAVA. Python 2 ou Python 3, choix d'un IDE, outils de build, contrôle de code, gestion des dépendances, choix des librairies, documentation, ressources indispensables à connaitre...
Dans cet exposé, on présentera OMicroB, une machine virtuelle OCaml pour microcontrôleurs à faibles ressources, inspirée des travaux précédents sur le projet OCaPIC. Cette machine virtuelle, destinée à être exécutée sur diverses architectures matérielles (AVR, PIC, ARM, ...) permet ainsi de factoriser le développement d’applications, mais aussi de généraliser l’analyse et le débogage du bytecode associé, tout en permettant un usage précautionneux de la mémoire. On cible alors des programmes ludiques ou de domotiques destinés à être exécutés sur des microcontrôleurs à faibles ressources, en insistant sur les particularités inhérentes à la programmation de systèmes embarqués.
Introduction à la programmation lock-free en C++11 au moyen des atomics. Présentation données par Cyril Comparon lors des rencontres C++ de Montpellier (novembre 2014).
Algorithmique et Programmation - informatique - débutantRidoinBahadi
introduction à l'algorithmique - algorithmique et programmation pour les tronc commun - informatique au lycée - introduction au développement informatique - comprendre l'algorithmique
Cours de théorie des langages, théorie de la compilation, techniques de compilations et paradigmes de programmation que je dispense aux Ingé 2 et 3 à l’École National des Sciences Géographiques de Paris.
Théorie des langages - 03 - Principes et paradigmesYann Caron
Cours de théorie des langages, théorie de la compilation, techniques de compilations et paradigmes de programmation que je dispense aux Ingé 2 et 3 à l’École National des Sciences Géographiques de Paris.
JAVA n'a plus de secret pour vous. Créer un projet, le passer de maven à graddle, enlever Spring, remplacer Guava par les API de Java 8 vous le faites sans même réfléchir. Vous avez essayé Python et la ce n'est plus la même affaire. Passé le "Hello World", quand il a fallu faire un projet de la vrai vie le courage vous a quitté. Cette conférence donnera les clefs pour bien débuter en Python quand on est un dev JAVA. Python 2 ou Python 3, choix d'un IDE, outils de build, contrôle de code, gestion des dépendances, choix des librairies, documentation, ressources indispensables à connaitre...
Dans cet exposé, on présentera OMicroB, une machine virtuelle OCaml pour microcontrôleurs à faibles ressources, inspirée des travaux précédents sur le projet OCaPIC. Cette machine virtuelle, destinée à être exécutée sur diverses architectures matérielles (AVR, PIC, ARM, ...) permet ainsi de factoriser le développement d’applications, mais aussi de généraliser l’analyse et le débogage du bytecode associé, tout en permettant un usage précautionneux de la mémoire. On cible alors des programmes ludiques ou de domotiques destinés à être exécutés sur des microcontrôleurs à faibles ressources, en insistant sur les particularités inhérentes à la programmation de systèmes embarqués.
Monitoring d'applications/environnements PHP : APM et PinbaIdaf_1er
PHP s'est industrialisé, aujourd'hui, un besoin de monitoring existe au niveau des applications écrites en PHP et de la plateforme sur laquelle elles reposent.
En parallèle, le besoin de montée en charge et de tolérance de faute est grandissant, en particulier avec le cloud computing, il devient donc crucial d'avoir la possibilité de surveiller l'ensemble de son infrastructure, à cette fin, cette session présentera une solution entièrement bâtie sur du logiciel libre.
Alternative PHP Monitor (APM) : extension PHP non-intrusive permettant la capture de divers évènements, tels que les erreurs et lenteurs d'exécution.
Pinba : extension PHP permettant la collecte en base de données d'informations relatives à l'exploitation de vos applications en production. De multiples rapports peuvent ensuite être élaborés pour fournir des statistiques, notamment de temps d'exécution sur des parties de codes.
SIMD extensions have been a feature of choice for processor manufacturers for a couple of decades. Designed to exploit data parallelism in applications at the instruction level, these extensions still require a high level of expertise or the use of potentially fragile compiler support or vendor-specific libraries. While a large fraction of their theoretical accelerations can be obtained using such tools, exploiting such hardware becomes tedious as soon as application portability across hardware is required.
Accessing such capabilities directly from C++ code could be a major improvements in a lot of use cases. Different take on this has been proposed either by the community or as an actual standard proposal. Solutions include pragma based annotations, standard algorithms policies, full blown compiler support and libraries.
In this talk we will present one such solution - the Boost.SIMD library (currently being proposed as such) which takes a library approach to this issues.
We will go over the basic notion required to grasp SIMD programming in general. Then, we'll discuss the different existing approaches. We will describe Boost.SIMD API and API design to demonstrate how it solves issues raised by the actual idiomatic way of writting SIMD enabled code. Design issues like standard algorithm integration, memory handling and how to fill the gaps in SIMD instructions sets will be discussed. Finally, we show its performances with respect to a subset of well known benchmarks.
The Goal and The Journey - Turning back on one year of C++14 MigrationJoel Falcou
C++14 has been announced as the next best thing since sliced bread in terms of simplicity, performance and overall elegance of c++ code. This talk is the story of why and how we decided to migrate one of our old 'modern C++' software library -- BSP++, a C++ implementation of the BSP parallel programming model -- to C++14.
More than just a recollection of 'use this' or 'do that' mottos, this talk will try to ponder on :
why one should consider migrating to C++14 now
which features actually helped and which one did not
the traps and pitfalls compilers tried to pull on us
HDR Defence - Software Abstractions for Parallel ArchitecturesJoel Falcou
Performing large, intensive or non-trivial computing on array like data
structures is one of the most common task in scientific computing, video game
development and other fields. This matter of fact is backed up by the large number
of tools, languages and libraries to perform such tasks. If we restrict ourselves to
C++ based solutions, more than a dozen such libraries exists from BLAS/LAPACK
C++ binding to template meta-programming based Blitz++ or Eigen.
If all of these libraries provide good performance or good abstraction, none of
them seems to fit the need of so many different user types. Moreover, as parallel
system complexity grows, the need to maintain all those components quickly
become unwieldy. This thesis explores various software design techniques - like
Generative Programming, MetaProgramming and Generic Programming - and their
application to the implementation of various parallel computing libraries in such a
way that abstraction and expressiveness are maximized while efficiency overhead is
minimized.
Automatic Task-based Code Generation for High Performance DSELJoel Falcou
Providing high level tools for parallel programming while sustaining a high level of performance has been a challenge that techniques like Domain Specific Embedded Languages try to solve. In previous works, we investigated the design of such a DSEL – NT2 – providing a Matlab -like syntax for parallel numerical computations inside a C++ library.
Main issues addressed here is how liimtaions of classical DSEL generation and multithreaded code generation can be overcome.
(Costless) Software Abstractions for Parallel ArchitecturesJoel Falcou
Performing large, intensive or non-trivial computing on array like data structures is one of the most common task in scientific computing, video game development and other fields. This matter of fact is backed up by the large number of tools, languages and libraries to perform such tasks. If we restrict ourselves to C++ based solutions, more than a dozen such libraries exists from BLAS/LAPACK C++ binding to template meta-programming based Blitz++ or Eigen. If all of these libraries provide good performance or good abstraction, none of them seems to fit the need of so many different user types.
Moreover, as parallel system complexity grows, the need to maintain all those components quickly become unwieldy. This talk explores various software design techniques - like Generative Programming, MetaProgramming and Generic Programming - and their application to the implementation of a parallel computing librariy in such a way that:
- abstraction and expressiveness are maximized - cost over efficiency is minimized
We'll skim over various applications and see how they can benefit from such tools. We will conclude by discussing what lessons were learnt from this kind of implementation and how those lessons can translate into new directions for the language itself.
Boost.Dispatch is a generic tag-dispatching library that allows for specializing functions based on type constraints. It introduces a hierarchy system to categorize types and functions based on tags. This allows defining implementations of functions like "plus" for different argument types and architectures. The dispatch call uses the hierarchy information to select the best matching implementation at call sites in a generic way. This minimizes code duplication and increases the applicability of tag dispatching in C++.
Designing Architecture-aware Library using Boost.ProtoJoel Falcou
This document discusses designing architecture-aware libraries using Boost.Proto. It describes how the NT2 scientific computing library was redesigned using Boost.Proto to make it more extensible and able to better support new hardware architectures. The redesign segmented the evaluation of expressions into phases. Boost.Proto transforms are used in each phase to advance code generation. Hardware specifications influence function overloads through generalized tag dispatching, allowing the best function implementation to be selected for a given hardware architecture. This makes it possible to more easily add support for new optimization schemes and hardware targets to the library.
Generative and Meta-Programming - Modern C++ Design for Parallel Computing
Boost.SIMD
1. Le SIMD en pratique avec Boost.SIMD
Unlocked software performance
Mathias Gaunard, Joel Falcou
NumScale - Université Paris Sud
23 mai 2014
2. Unlocked software performance
NumScale en quelques mots
La Société
■ Start-up implantée sur le campus de l’Université Paris-Sud, sur le plateau de
Saclay
■ Expertise en optimisation des logiciels et en calcul parallèle
Solutions
■ Proler sous Linux non-intrusif (langages compilés et JIT)
■ Bibliothèques C++ pour le calcul optimisé
■ Compilateurs (Python, MATLAB)
■ Optimisation de logiciels
■ Portage et passage à l’échelle
1 of 35
3. Unlocked software performance
NumScale en quelques mots
■ Permettre aux développeurs d’accéder à la pleine puissance des processeurs
modernes
■ Optimisation des calculs en prenant en compte algorithmes, matériel et
techniques de programmation
Algorithme
Analyse numérique
Algèbre linéaire
Traitement du signal
Traitement d’image
Vision
Simulation
Statistiques
...
Matériel
SIMD
Multi-cœurs
Distribué
GPU
Smartphones
Embarqué, DSPs
Logiciel
C, C++
FORTRAN
MATLAB
Python
Java, C#
2 of 35
4. Unlocked software performance
NumScale et le C++
Pourquoi le C++
■ Le C++ a l’accès bas niveau nécessaire pour exploiter au mieux la
mémoire, le système, les processeurs et le parallélisme
■ Le C++ a les capacités d’abstraction nécessaires pour pouvoir
construire des composants portables et ré-utilisables
NumScale s’implique
■ Implication auprès du comité de normalisation ISO
■ Participation à la communauté open-source, en particulier via les
bibliothèques Boost
3 of 35
5. Unlocked software performance
NumScale et le SIMD
■ Parallélisation à l’intérieur même des cœurs, peu utilisé en pratique
■ Gains de l’ordre de x2 à x16 cumulable avec le multi-cœurs
■ Réduire les temps de calcul sans toucher à l’infrastructure
■ Marche particulièrement bien pour tout le calcul numérique type HPC
4 of 35
7. Unlocked software performance
Un parallélisme toujours plus présent
Le parallélisme évident
■ Architecture Multi-cœurs
■ Architecture Many-cœurs
■ Systèmes Distribués
Le parallélisme moins évident
■ Pipeline intra-processeurs
■ Exécutions super-scalaire et/ou out of order
■ les extensions SIMD
6 of 35
8. Unlocked software performance
Un parallélisme toujours plus présent
Le parallélisme évident
■ Architecture Multi-cœurs
■ Architecture Many-cœurs
■ Systèmes Distribués
Le parallélisme moins évident
■ Pipeline intra-processeurs
■ Exécutions super-scalaire et/ou out of order
■ les extensions SIMD
6 of 35
9. Unlocked software performance
Qu’est-ce que le SIMD ?
Instructions
Data
Results
SISD SIMD
Principes
■ Single Instruction, Multiple Data
■ Chaque operation est appliquée sur
N valeurs dans un seul registre (si
registres 128 bits, 4 valeurs de 32
bits ou 2 valeurs de 64 bits)
■ Théoriquement N fois plus rapide
que l’ALU/FPU en mode normal
7 of 35
14. Unlocked software performance
Le SIMD en mode manuel, int32 * int32 -> int32
// Altivec
// reinterpret as u16
short0 = (__vector unsigned short)a0 ;
short1 = (__vector unsigned short)a1 ;
// shifting constant
shift = vec_splat_u32 (-16) ;
sf = vec_rl(a1, shift_) ;
// Compute high part of the product
high = vec_msum( short0 , (__vector unsigned short)sf
, vec_splat_u32 (0)
) ;
// Complete by adding low part of the 16 bits product
return vec_add( vec_sl(high , shift_)
, vec_mulo(short0 , short1)
) ;
9 of 35
15. Unlocked software performance
Et les compilateurs alors ?
Limitations de l’auto-vectorisation
■ L’auto-vectorisation ne se déclenche que si :
□ la mémoire est bien agencée
□ le code est intrinséquement vectorisable
■ Les fonctions compilées à l’extérieur ne sont pas vectorisées
■ Le compilateur peut manquer d’informations pour effectuer la vectorisation
Conclusion
■ Le SIMD explicite permet de garantir la vectorisation
■ Challenge : Maintenir un code SIMD sur de multiples plate-formes
10 of 35
16. Unlocked software performance
Notre approche
Une abstraction de haut-niveau
■ Utilisation d’un Domain-Specic Embedded Language (DSEL)
■ Abstraction des registres SIMD comme un bloc de données
■ Applications d’optimisations au niveau des expressions
Integration au langage
■ Permettre l’écriture de code générique
■ Intégration au sein de la STL
■ Reposer sur des concepts issus du C++ moderne
11 of 35
18. Unlocked software performance
L’abstraction pack
La notion simd::pack<T,N>
pack<T, N> registre SIMD contenant N élements de type T
pack<T> idem avec le N optimal pour l’architecture courante
Se comporte comme une valeur de type T mais en effectuant les opérations sur les N
valeurs de son contenu en une seul fois.
Contraintes
■ T est soit un type fondamental soit un tuple Fusion
■ logical<T> permet de gérer les valeurs booléennes.
■ N doit être une puissance de 2.
13 of 35
19. Unlocked software performance
Opérations sur les pack
Opérateurs du langage
■ Tous les opérateurs classiques sont applicables : pack<T> ⊕ pack<T> , pack<T> ⊕ T ,
T ⊕ pack<T>
■ Pas de conversion ni de promotion entière :
uint8_t(255) + uint8_t(1) = uint8_t(0)
Comparaisons
■ ==, !=, <, <=,> et >= effectue des comparaisons vectorielles.
■ compare_equal, compare_less, etc. retournent le résultat booléen de la
comparaison lexicographique de leurs paramètres.
Autres propriétés
■ Modélise à la fois une RandomAccessFusionSequence et RandomAccessRange
■ p[i] retourne un proxy pour l’accès aux éléments du registre
14 of 35
20. Unlocked software performance
Gestion des chargements
Chargement
■ Mode aligné (aligned_load/store) et non-aligné (load/store)
■ Gestion des chargements statiquement désalignés
■ Gestion des chargements/stockages conditionnels et/ou dispersés
15 of 35
21. Unlocked software performance
Gestion des chargements
Chargement
■ Mode aligné (aligned_load/store) et non-aligné (load/store)
■ Gestion des chargements statiquement désalignés
■ Gestion des chargements/stockages conditionnels et/ou dispersés
Exemples
aligned_load< pack<T, N> >(p, i) charge un pack depuis l’adresse alignée p + i.
0D 0E 0F 10 11 12 13 14 15 16 17 18
aligned_load<pack<float>>(0x10,0)
Main Memory
... ...
10 11 12 13
15 of 35
22. Unlocked software performance
Gestion des chargements
Chargement
■ Mode aligné (aligned_load/store) et non-aligné (load/store)
■ Gestion des chargements statiquement désalignés
■ Gestion des chargements/stockages conditionnels et/ou dispersés
Exemples
aligned_load< pack<T, N>, Offset>(p, i) charge un pack depuis l’adresse alignée
p + i + Offset.
0D 0E 0F 10 11 12 13 14 15 16 17 18
aligned_load<pack<float>,2>(0x10,2)
Main Memory
... ...
12 13 14 15
15 of 35
23. Unlocked software performance
Réordonnancement de registre
Principe et Intérêt
■ Les éléments d’un registre SIMD sont permutables par le hardware
■ Remplace des chargements mémoires dans certains algorithmes
■ Encapsulé par boost::simd::shuffle
Exemples :
// a = [ 1 2 3 4 ]
pack <float > a = enumerate < pack <float > >(1) ;
// b = [ 10 11 12 13 ]
pack <float > b = enumerate < pack <float > >(10) ;
// res = [4 12 0 10]
pack <float > res = shuffle <3,6,-1,4>(a,b) ;
16 of 35
24. Unlocked software performance
Réordonnancement de registre
Principe et Intérêt
■ Les éléments d’un registre SIMD sont permutables par le hardware
■ Remplace des chargements mémoires dans certains algorithmes
■ Encapsulé par boost::simd::shuffle
Exemples :
struct reverse_
{
template <class I, class C>
struct apply : mpl : :int_ <C : :value - I : :value - 1> {} ;
} ;
// res = [n n-1 ... 2 1]
pack <float > res = shuffle <reverse_ >(a) ;
16 of 35
25. Unlocked software performance
Intégration avec la STL
■ Algorithmes :
□ boost::simd::transform
□ boost::simd::fold
□ Foncteur polymorphe pour support scalaire/SIMD
17 of 35
26. Unlocked software performance
Intégration avec la STL
■ Algorithmes :
□ boost::simd::transform
□ boost::simd::fold
□ Foncteur polymorphe pour support scalaire/SIMD
■ Iterateurs :
□ Encapsule des stratégies de parcours SIMD :
□ boost::simd::(aligned_)(input/output_)iterator
□ boost::simd::direct_output_iterator
□ boost::simd::shifted_iterator
17 of 35
27. Unlocked software performance
Intégration avec la STL
■ Algorithmes :
□ boost::simd::transform
□ boost::simd::fold
□ Foncteur polymorphe pour support scalaire/SIMD
■ Iterateurs :
□ Encapsule des stratégies de parcours SIMD :
□ boost::simd::(aligned_)(input/output_)iterator
□ boost::simd::direct_output_iterator
□ boost::simd::shifted_iterator
■ Allocateur :
□ Fournit de la mémoire correctement alignée
□ Possibilité d’adapter un allocateur existant
17 of 35
28. Unlocked software performance
Intégration avec la STL
std : :vector <float , simd : :allocator <float > > v(N) ;
simd : :transform( v.begin(), v.end()
, []( auto const& p)
{
return p * 2.f ;
}
) ;
18 of 35
30. Unlocked software performance
Optimisations architecturales
Problématique
■ La plupart des extensions SIMD proposent des opérateurs fusionnés type fma.
■ Ces optimisations doivent rester transparentes
■ Via une implantation à base d’Expression Templates, B.SIMD auto-optimise
ces motifs.
Exemple :
■ a * b + c s’évalue comme fma(a, b, c)
■ a + b * c s’évalue comme fma(b, c, a)
■ !(a < b) s’évalue comme is_nle(a, b)
19 of 35
31. Unlocked software performance
Architectures Supportées
Version Open Source
■ Intel SSE2-4, AVX
■ PowerPC VMX
Version Propriétaire
■ ARM Neon
■ Intel AVX2, XOP, FMA3, FMA4
■ Intel MIC
20 of 35
32. Unlocked software performance
Autres fonctions ...
Arithmetic
■ arithmetique saturée
■ multiplication longue
■ conversion oat/int
■ round, oor, ceil, trunc
■ sqrt, cbrt
■ hypot
■ average
■ random
■ min/max
■ division et reste arrondi
Bitwise
■ select
■ andnot, ornot
■ popcnt
■ ffs
■ ror, rol
■ rshr, rshl
■ twopower
IEEE
■ ilogb, frexp
■ ldexp
■ next/prev
■ ulpdist
Predicates
■ comparaison à zero
■ négation de
comparaison
■ is_unord, is_nan,
is_invalid
■ is_odd, is_even
■ majority
21 of 35
33. Unlocked software performance
Réduction et Opérations intra-registre
Reduction
■ any, all
■ nbtrue
■ minimum/maximum,
posmin/posmax
■ sum
■ product, dot product
SWAR
■ group/split
■ reduction splattée
■ cumsum
■ sort
22 of 35
35. Unlocked software performance
Fonctions de base
Fonctions trigonométriques simple précision
Architecture : Core i7 SandyBridge, AVX en cycles/valeurs
Fonction Intervalle std Scalaire SIMD
exp [−10, 10] 46 38 7
log [−10, −10] 42 37 5
asin [−1, 1] 40 35 13
cos [−20π, 20π] 66 47 6
fast_cos [−π/4, π/4] 32 9 1.3
24 of 35
36. Unlocked software performance
Générateur de fractale
■ Génére une image fractale via l’évalutaion d’un fonction complexe
■ Application compute-bound
■ Challenge : Quantité de travail dépendante du pixel
25 of 35
37. Unlocked software performance
Générateur de fractale
template <class T> typename meta : :as_integer <T> : :type
julia(T const& a, T const& b)
{
typename meta : :as_integer <T> : :type iter ;
std : :size_t i = 0 ;
T x, y ;
do {
T x2 = x * x ;
T y2 = y * y ;
T xy = s_t(2) * x * y ;
x = x2 - y2 + a ;
y = xy + b ;
iter = selinc(x2 + y2 < T(4), iter) ;
} while(any(mask) && i++ < 256) ;
return iter ;
}
26 of 35
39. Unlocked software performance
Détection de Mouvements
■ Algorithme Sigma-Delta par Manzanera et al.
■ Approche mono-modale basé sur l’extraction du fond
■ Modélise la variation d’intensité par une gaussienne en chaque pixel
■ Challenge : Intensité arithmétique très faible
28 of 35
40. Unlocked software performance
Détection de Mouvements
template <typename T>
T sigma_delta(T& bkg , T const& frm , T& var)
{
bkg = selinc(bkg < frm , seldec(bkg > fr, bkg)) ;
T dif = dist(bkg , frm) ;
T mul = muls(dif ,3) ;
var = if_else( dif != T(0)
, selinc(var < mul , seldec(var > mul , var))
, var
) ;
return if_zero_else_one( dif < var ) ;
}
29 of 35
42. Unlocked software performance
Solveur de Système Tridiagonal Creux
■ Résout Ax = b avec A sparse
■ Application : mécanique des
uides
■ Challenge : vectoriser malgré
l’aspect sparse
■ Solution : Mélanges arbitraires
pour recompactication
31 of 35
45. Unlocked software performance
Conclusion
Boost.SIMD
■ C++ permet d’allier abstraction et performance
■ Une accélération garantie sur un large panel d’architectures
■ Retrouvez nous sur https://github.com/MetaScale/nt2
■ Tests, commentaires et retours bienvenus
À venir
■ Intégration de la version Open Source dans Boost
■ Support pour nouvelles architectures : QPX, C6x, etc...
34 of 35