Commit 7f92a78e authored by Celian Gossec's avatar Celian Gossec

UPDATE: 1903: Pushing updates after weekend progression

parent 5e30f974
...@@ -105,3 +105,11 @@ ...@@ -105,3 +105,11 @@
lrdepaper = {http://www.lrde.epita.fr/dload/papers/demaille.13.ciaa.pdf}, lrdepaper = {http://www.lrde.epita.fr/dload/papers/demaille.13.ciaa.pdf},
lrdenewsdate = {2013-05-02} lrdenewsdate = {2013-05-02}
} }
@misc{pybind11,
author = {Wenzel Jakob and Jason Rhinelander and Dean Moldovan},
year = {2017},
note = {https://github.com/pybind/pybind11},
title = {pybind11 -- Seamless operability between C++11 and Python}
}
...@@ -2,11 +2,36 @@ ...@@ -2,11 +2,36 @@
\usepackage[utf8]{inputenc} \usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc} \usepackage[T1]{fontenc}
\usepackage[francais]{babel} \usepackage[french]{babel}
\usepackage{wrapfig} \usepackage{wrapfig}
\usepackage{hyperref} \usepackage{hyperref}
\usepackage{booktabs} \usepackage{booktabs}
\usepackage{tabularx} \usepackage{tabularx}
\usepackage{listings}
\usepackage{color}
\usepackage{tikz}
\usetikzlibrary{positioning,calc}
\definecolor{dkgreen}{rgb}{0,0.6,0}
\definecolor{gray}{rgb}{0.5,0.5,0.5}
\definecolor{mauve}{rgb}{0.58,0,0.82}
\lstset{frame=tb,
language=C++,
aboveskip=3mm,
belowskip=3mm,
showstringspaces=false,
columns=flexible,
basicstyle={\small\ttfamily},
numbers=none,
numberstyle=\tiny\color{gray},
keywordstyle=\color{blue},
commentstyle=\color{dkgreen},
stringstyle=\color{mauve},
breaklines=true,
breakatwhitespace=true,
tabsize=3
}
\usetheme{KremlinBicetre} \usetheme{KremlinBicetre}
...@@ -21,7 +46,7 @@ ...@@ -21,7 +46,7 @@
\end{frame}% \end{frame}%
} }
\date[14-02-2019]{Lightning Talk: Feb 14} \date[19-03-2019]{Lightning Talk: 19 Mars}
\author{Célian \textsc{Gossec}} \author{Célian \textsc{Gossec}}
\title[Le pont statique-dynamique]{Le pont statique-dynamique} \title[Le pont statique-dynamique]{Le pont statique-dynamique}
\institute[LRDE]{LRDE\\Laboratoire de Recherche et Développement de l'EPITA} \institute[LRDE]{LRDE\\Laboratoire de Recherche et Développement de l'EPITA}
...@@ -34,7 +59,7 @@ ...@@ -34,7 +59,7 @@
\maketitle \maketitle
\begin{frame} \begin{frame}
\frametitle{La situation} \frametitle{Rappel: la situation}
\structure{Point de départ.} Milena, une bibliothèque \emph{générique et performante} de traitement d'image codée en \structure{Point de départ.} Milena, une bibliothèque \emph{générique et performante} de traitement d'image codée en
C++. C++.
...@@ -46,17 +71,18 @@ ...@@ -46,17 +71,18 @@
\begin{center} \begin{center}
\setlength{\fboxsep}{0pt} \setlength{\fboxsep}{0pt}
\begin{tabular}{cccc} \begin{tabular}{cccc}
& \tiny image 2D & \tiny graph & \tiny mesh \\ & \tiny image 2D & \tiny graph & \tiny mesh \\
\tiny in: & \fbox{\includegraphics[width=.15\linewidth]{figs/geninput-000b}} & \tiny in: & \fbox{\includegraphics[width=.15\linewidth]{figs/geninput-000b}} &
\fbox{\includegraphics[width=.15\linewidth]{figs/geninput-001b}} & \fbox{\includegraphics[width=.15\linewidth]{figs/geninput-001b}} &
\fbox{\includegraphics[width=.15\linewidth]{figs/geninput-002b}} \\ \fbox{\includegraphics[width=.15\linewidth]{figs/geninput-002b}} \\
% %
\tiny out: & \fbox{\includegraphics[width=.15\linewidth]{figs/genoutput-000}} & \tiny out: & \fbox{\includegraphics[width=.15\linewidth]{figs/genoutput-000}} &
\fbox{\includegraphics[width=.15\linewidth]{figs/genoutput-001b}} & \fbox{\includegraphics[width=.15\linewidth]{figs/genoutput-001b}} &
\fbox{\includegraphics[width=.15\linewidth]{figs/genoutput-002b}} \\ \fbox{\includegraphics[width=.15\linewidth]{figs/genoutput-002b}} \\
\end{tabular} \end{tabular}
\end{center}
\end{center}
\structure{Objectif.} Faciliter l'usage d'Olena.\\[2pt] \structure{Objectif.} Faciliter l'usage d'Olena.\\[2pt]
...@@ -64,6 +90,7 @@ ...@@ -64,6 +90,7 @@
\begin{frame} \begin{frame}
\frametitle{Rappel: la situation}
\structure{Moyen.} Exposer Olena en Python. \structure{Moyen.} Exposer Olena en Python.
\bigskip \bigskip
...@@ -77,111 +104,93 @@ ...@@ -77,111 +104,93 @@
\end{frame} \end{frame}
\begin{frame} \begin{frame}
\frametitle{Les différentes possibilités} \frametitle{Rappel: notre objectif : une approche hybride}
\begin{itemize} Fournir une type effacé avec interface d'image qui puisse être utilisé avec
\item La compilation à la volée (Just-In-Time) numpy,
\item Polymorphisme de coercition
\item L'effacement de type
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{Approche 1 : Les compilateurs JIT}
Compilateurs JIT = compilation à la volée. \newline
Principe utilisé dans Vcsn\footnote{\tiny Implementation Concepts in {V}aucanson 2. A. Demaille et al.,
\textit{CIAA'13}}
\bigskip
\begin{tabularx}{\linewidth}{>{\parskip1ex}X@{\kern4\tabcolsep}>{\parskip1ex}X}
%\toprule
\hfil\bfseries \includegraphics[width=.7cm]{figs/angrygreen}
&
\hfil\bfseries \includegraphics[width=.7cm]{figs/angryred}
\\\cmidrule(r{3\tabcolsep}){1-1}\cmidrule(l{-\tabcolsep}){2-2}
Aussi rapide que le C++ (après la 1\iere compilation) \par
&
\parbox{\linewidth}{
1\iere compilation lente \\[10pt]
Nécessite un compilateur \\[10pt]
Pas d'export NumPy\\ (par défaut) \par
}
\\ %\bottomrule
\end{tabularx}
\end{frame}
\begin{frame}
\frametitle{Approche 2 : Polymorphisme de coercition}
Approche utilisée par Matlab \newline
Un type plus large qui englobe tous les types désirés.
\bigskip
\begin{tabularx}{\linewidth}{>{\parskip1ex}X@{\kern4\tabcolsep}>{\parskip1ex}X} mais également\ldots
%\toprule
\hfil\bfseries \includegraphics[width=.7cm]{figs/angrygreen}
&
\hfil\bfseries \includegraphics[width=.7cm]{figs/angryred}
\\\cmidrule(r{3\tabcolsep}){1-1}\cmidrule(l{-\tabcolsep}){2-2}
Traitement d'un seul type rend facile l'exportation \pause
vers Python \par \medskip
& \begin{itemize}
\item capable de se ``caster'' vers les types concrets (instancier des algortihmes par JIT)
\item capable de se ``convertir'' vers des types concrets (utiliser des algorithmes pré-définis)
\end{itemize}
Limitation de la généricité \par \bigskip
Perte de performance \par pour obtenir un maximum de performances.
\\ %\bottomrule
\end{tabularx}
\end{frame} \end{frame}
\begin{frame} \begin{frame}
\frametitle{Approche 3: Effacement de type} \frametitle{L'état du projet}
Type erasure = Type opaque avec une interface d'image. \begin{itemize}
\item Réimplementation d'une version miniaturisée de la classe
\bigskip \textit{Image2d} de Milena \pause
\item Création de classes permettant l'extraction d'information depuis
\begin{tabularx}{\linewidth}{>{\parskip1ex}X@{\kern4\tabcolsep}>{\parskip1ex}X} les types template vers les types concrets \pause
%\toprule \item Implémentation des liaisons (\textit{bindings}) C++/Python avec
\hfil\bfseries \includegraphics[width=.7cm]{figs/angrygreen} Pybind11 \pause
& \item Utilisation des \textit{buffer \_protocol} de Pybind11 pour
\hfil\bfseries \includegraphics[width=.7cm]{figs/angryred} permettre une interface numpy
\\\cmidrule(r{3\tabcolsep}){1-1}\cmidrule(l{-\tabcolsep}){2-2} \end{itemize}
Un seul type rend facile l'exportation
vers Python
&
Grosse perte de performance
\\%\bottomrule
\end{tabularx}
\end{frame} \end{frame}
\begin{frame} Du code C++ codé pour une classe \textit{template}\ldots
\frametitle{Notre objectif : une approche hybride} \begin{lstlisting}
Fournir une type effacé avec interface d'image qui puisse être utilisé avec image2d<float> stretch(const image2d<T>& src)
numpy\footnote{\tiny https://github.com/pybind/pybind11}, \{
auto res = image2d<float>(src.width(), src.height());
mais \ldots auto span = src.values();
std::transform(span.begin(), span.end(), res.values().begin(),
[](T val) -> float
\{
return static\_cast<float>(val) / std::numeric\_limits<T>::max();
\});
return res;
\}
\end{lstlisting}
\pause \begin{frame}
\medskip Utilisable depuis Python \newline
\begin{tikzpicture}
\tikzset{land/.style={draw}, obj/.style={draw,fill=red!20}};
\draw node[] (A) {Python land} -- ++(4,0) node[] (B) {C++ land};
\coordinate (C) at ($(A)!0.5!(B)$);
\draw (C) -- ++(0,-4);
\node[obj] [below = 0.4cm of A] (Py0) {np.array};
\node[obj] [below = 0.4cm of B] (ndima) {\tt ndimage<>};
\node[obj] [below = 0.5cm of ndima] (D) {\tt ndimage<T>};
\node[obj] [below right =.1cm and 0.3cm of D] (stretch) {\tt stretch(ndimage2d<T>)};
\draw[->,thick] (D) -- (ndima) node[midway,above] {};
\draw[<->,dashed] (Py0) -- (ndima) node[midway,above] {py::buffer};
% \draw[-, thick] (D) -- (stretch) node[midway,above] {};
\end{tikzpicture}
\includegraphics[scale=.32]{figs/python_example}
\end{frame}
\begin{itemize} \begin{frame}
\item capable de se ``caster'' vers les types concrets (instancier des algortihmes par JIT) \frametitle{Les prochains pas}
\item capable de se ``convertir'' vers des types concrets (utiliser des algorithmes pré-définis) \begin{itemize}
\item Ajout de méthodes pour éviter le cast explicite vers les types C++
(afin de pouvoir faire en Python\newline res = olena.stretch(arr), sans
passer par\newline img = olena.image2d(arr)) \pause
\item Continuer à se rapprocher des types complets d'olena
\end{itemize} \end{itemize}
\end{frame}
\bigskip \begin{frame}
pour récupérer la performance. \frametitle{Questions?}
\includegraphics{figs/questionmark}
\end{frame} \end{frame}
\begin{frame} \begin{frame}
\frametitle{Bibliographie} \frametitle{Bibliographie}
\scriptsize \scriptsize
\nocite{levillain.14.ciarp, roynard.18.rrpr, demaille.13.ciaa} \nocite{levillain.14.ciarp, roynard.18.rrpr, demaille.13.ciaa, pybind11}
\bibliography{biblio} \bibliography{biblio}
\bibliographystyle{apalike} \bibliographystyle{apalike}
\end{frame} \end{frame}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment