| % |
| % $Id$ |
| % |
| |
| \documentclass[letter,landscape]{seminar} |
| |
| \usepackage{pstcol} |
| \usepackage{slidesec} |
| \usepackage{semcolor} |
| |
| \input{seminar.bug} |
| \input{seminar.bg2} |
| |
| \usepackage{graphics} |
| \usepackage{fancybox} |
| \usepackage{fancyhdr} |
| \usepackage{epsfig} |
| |
| % Headers and footers personalization using the `fancyhdr' package |
| \fancyhf{} % Clear all fields |
| \renewcommand{\headrulewidth}{0.2mm} |
| \renewcommand{\footrulewidth}{0.2mm} |
| \fancyhead[C]{\Large\textbf{QsNet Support}} |
| %\fancyfoot[L]{\tiny\thedate} |
| \fancyfoot[L]{\includegraphics[scale=0.075]{penguin.eps}\\\tiny LINUX} |
| %\fancyfoot[R]{\small LLNL} |
| \fancyfoot[R]{\includegraphics[scale=0.2]{llnl.ps}\\\tiny LLNL} |
| \fancyfoot[C]{\tiny Page \theslide} |
| |
| % Create room for headers and footers |
| \renewcommand{\slidetopmargin}{2cm} |
| \renewcommand{\slidebottommargin}{3cm} |
| |
| % Center horizontally the headers and footers (see seminar.bug) |
| \renewcommand{\headwidth}{\textwidth} |
| |
| % To adjust the frame length to the header and footer ones |
| \autoslidemarginstrue |
| |
| % Hook to tell dvips to print in landscape mode |
| \def\printlandscape{\special{landscape}} |
| |
| % Possibilities: shadow, oval, double, none, plain |
| \slideframe{none} |
| |
| % display grey text diagonally across background of each slide |
| %\definecolor{LightGray}{gray}{0.85} |
| %\newslideframe{BackgroundText}{% |
| % \boxput{\rotatebox{56}{\scalebox{4.5}{% |
| % \textcolor{LightGray}{CONFIDENTIAL}}}}{#1}} |
| %\slideframe*{BackgroundText} |
| |
| % Put an image in the background of each slide |
| %\newslideframe{IMAGE}{% |
| % \boxput{\rput(1,0){\includegraphics[scale=1.0]{kaos_logo2.ps}}}{#1}} |
| %\slideframe*{IMAGE} |
| |
| % This allows text to be blued with \textcolor{Blue}{my text} |
| \definecolor{Blue}{rgb}{0.,0.,1.} |
| \definecolor{Gold}{rgb}{1.,0.84,0.} |
| \definecolor{Pink}{rgb}{1.,0.75,0.8} |
| |
| \begin{document} |
| |
| \slidepagestyle{fancy} |
| |
| % The presentation begins here. |
| |
| \begin{slide} |
| %\slideheading{The Big Picture} |
| \begin{center} |
| \epsfig{file=slurm.eps,scale=0.50} |
| \end{center} |
| \end{slide} |
| |
| \begin{slide} |
| \slideheading{Goals} |
| \small |
| \begin{itemize} |
| \item Encapsulate QsNet details so QSW include files, data structures, etc. |
| do not "pollute" the rest of slurm. |
| \item Provide the simplest API possible for manipulating QsNet interconnect |
| resources, but no simpler. |
| \item Checkpointability of internal library state for transfer to failover |
| slurmctld. |
| \item Interfaces to pack/unpack data structures in network byte order for |
| use in slurmd packet protocol discussed last week. |
| \item API calls compatable with standalone programs like pdsh and |
| long-running servers like slurmctld. |
| \item Both client (pdsh/slurmctld) and server (qshd/slurmd) side functions |
| provided. |
| \end{itemize} |
| \end{slide} |
| |
| \begin{slide} |
| \slideheading{Library Initialization} |
| \small |
| Initialize/finalize the library, optionally saving/restoring internal state. |
| \begin{verbatim} |
| int qsw_init(qsw_libstate_t restorestate); |
| void qsw_fini(qsw_libstate_t savestate); |
| \end{verbatim} |
| Allocate/free a {\tt qsw\_libstate\_t} to represent internal state. |
| \begin{verbatim} |
| int qsw_alloc_libstate(qsw_libstate_t *lsp); |
| void qsw_free_libstate(qsw_libstate_t ls); |
| \end{verbatim} |
| Pack/unpack a {\tt qsw\_libstate\_t} into a format suitable for transmitting |
| over the network, writing to checkpoint file, etc.. |
| \begin{verbatim} |
| int qsw_pack_libstate(qsw_libstate_t ls, void *buf, int size); |
| int qsw_unpack_libstate(qsw_libstate_t ls, void *buf, int size); |
| \end{verbatim} |
| \end{slide} |
| |
| \begin{slide} |
| \slideheading{Client Side Functions} |
| \small |
| Create all the interconnect information necessary to start a parallel |
| program including Elan capability, program description number, etc.. |
| \begin{verbatim} |
| int qsw_setup_jobinfo(qsw_jobinfo_t job, int nprocs, |
| bitstr_t *nodeset, int cyclic_alloc); |
| \end{verbatim} |
| Allocate/free a {\tt qsw\_jobinfo\_t} to represent job information. |
| \begin{verbatim} |
| int qsw_alloc_jobinfo(qsw_jobinfo_t *jobp); |
| void qsw_free_jobinfo(qsw_jobinfo_t job); |
| \end{verbatim} |
| Pack/unpack a {\tt qsw\_jobinfo\_t} into a format suitable for transmitting |
| over the network. |
| \begin{verbatim} |
| int qsw_pack_jobinfo(qsw_jobinfo_t job, void *buf, int size); |
| int qsw_unpack_jobinfo(qsw_jobinfo_t job, void *buf, int size); |
| \end{verbatim} |
| \end{slide} |
| |
| |
| \begin{slide} |
| \slideheading{Server Side Functions} |
| \small |
| 1: Fork. Wait. Destroy program group with {\tt qsw\_prog\_reap}. |
| \begin{verbatim} |
| int qsw_prog_reap(qsw_jobinfo_t jobinfo); |
| \end{verbatim} |
| 2: Initialize program description and capability with {\tt qsw\_prog\_init}. |
| Fork N times. Wait N times. Exit. Destroy capability with {\tt qsw\_prog\_fini}. |
| \begin{verbatim} |
| int qsw_prog_init(qsw_jobinfo_t jobinfo, uid_t uid); |
| int qsw_prog_fini(qsw_jobinfo_t jobinfo); |
| \end{verbatim} |
| 3: (N instances) Attach to a hardware context with {\tt qsw\_attach}. |
| Set up environment. Fork. Wait. Exit. |
| \begin{verbatim} |
| int qsw_attach(qsw_jobinfo_t jobinfo, int procnum); |
| \end{verbatim} |
| 4: Setuid to the user. Exec. |
| \end{slide} |
| |
| \begin{slide} |
| \slideheading{Discussion Points} |
| \small |
| \begin{itemize} |
| \item If library is initialized, {\tt qsw\_setup\_jobinfo} allocates |
| program descriptions and Elan hardware contexts sequentially, else random. |
| \item Library internal state checkpoint capability available for failover. |
| \item Pack/Unpack routines translate between host/network byte order. |
| Macros used to permit assertions about size of incoming data types before |
| type promotion. |
| \item bitstr\_t used to represent ``nodeset''. Bit positions are elan |
| addresses. There is no provision for converting between Elan address and |
| hostname. |
| \item Elan include files are not required outside of qsw.c. |
| \item configure --with-elan or qsw.c becomes an empty source file. |
| \end{itemize} |
| \end{slide} |
| |
| \begin{slide} |
| \slideheading{pack.c} |
| \tiny |
| htonl/ntohl, htons/ntohs functions with macro wrappers with many assertions: |
| \begin{verbatim} |
| void pack32(uint32_t val, void **bufp, int *lenp); |
| void pack16(uint16_t val, void **bufp, int *lenp); |
| void unpack32(uint32_t *val, void **bufp, int *lenp); |
| void unpack16(uint16_t *val, void **bufp, int *lenp); |
| \end{verbatim} |
| Example - qsw\_pack\_libstate(qsw\_libstate\_t ls, void *data, int len) |
| \begin{verbatim} |
| pack32(ls->ls_magic, &data, &len); |
| pack32(ls->ls_prognum, &data, &len); |
| pack32(ls->ls_hwcontext, &data, &len); |
| \end{verbatim} |
| Example - qsw\_unpack\_libstate(qsw\_libstate\_t ls, void *data, int len) |
| \begin{verbatim} |
| unpack32(&ls->ls_magic, &data, &len); |
| unpack32(&ls->ls_prognum, &data, &len); |
| unpack32(&ls->ls_hwcontext, &data, &len); |
| \end{verbatim} |
| \end{slide} |
| |
| |
| \end{document} |