Divorcing Language Dependencies from a Scientific Software ...

27
Divorcing Language Dependencies from a Scientific Software Library Gary Kumfert, with Scott Kohn, Jeff Painter, & Cal Ribbens LLNL VaTech

Transcript of Divorcing Language Dependencies from a Scientific Software ...

Divorcing Language Dependencies from a Scientific Software Library

Gary Kumfert, with

Scott Kohn, Jeff Painter, & Cal Ribbens

LLNL VaTech

GKK 2CASC

Language Interoperability Tool♦ You specify “interfaces” in our language♦ We generate glue code between application

and library

Part of a Component Framework♦ Enables OOP in non-OOP languages♦ Enables safe Dynamic Casting and

QueryInterface capabilities

GKK 3CASC

What I mean by “Language Interoperability”

Simulation Framework(C)

Scripting Driver(Python)

Visualization System(Java)

Solver Library(C++)

Numerical Routines(f90)

GKK 4CASC

Hand Coded SolutionsJNI

NativeSWIG

Platform Dependent

C

C++

f77

f90

Python

Java

GKK 5CASC

Objects, Virtual Functions, RMI & Reference Counting: all from Babel

f77

Java

BabelC f90

C++ Python

GKK 6CASC

Babel generates glue code

machineconfiguration

database

f77

SIDL interfacedescription

parser analyzer backendC

Python

C++

XML repositoryinterface

description

GKK 7CASC

Scientific Interface Definition Language (SIDL)version Hypre 0.5;version ESI 1.0;

import ESI;

package Hypre {interface Vector extends ESI.Vector {

double dot(in Vector y);void axpy(in double a, in Vector y);

};interface Matrix {

void apply(out Vector Ax, in Vector x);};class SparseMatrix implements Matrix, RowAddressable {

void apply(out Vector Ax, in Vector x);};

};

classexceptioninterfacepackage

GKK 8CASC

Software to be “divorced” from its language dependence

Scalable parallel linear solvers and preconditioners (LLNL)

Implemented in ANSI C using MPI

“Object Based”

GKK 9CASC

Collaboration ObjectivesBabel side:♦ demonstrate Babel technology ♦ feedback from library developers

Hypre side:♦ Automatically create Fortran bindings♦ Explore new designs 4Object-Oriented 4Component-Based

♦ Integrate other software 4C++ or F77

GKK 10CASC

Envisioned Architecture

F77 PythonC++

“official” hypreinterface (ANSI C)

MPI

GKK 11CASC

Approach

Identify minimal working subset of hypre♦ Structured Solvers

Create SIDL description Add base classes to create heirarchyTie generated code to existing hypre libraryIterate

GKK 12CASC

Problem: Creating wrong types

SIDL has 3 types of objects♦ interfaces - no implementations (pure abstract)♦ abstract classes - partial implementations♦ concrete classes - full implementations

Users were creatingabstract classes whenthey meant to createconcrete classes

interface Foo { int doThis( in int i );int doThat( in int i );

}

class Bar implements Foo { int doThis( in int i );

};

class Grille implements Foo { int doThis( in int i );int doThat( in int i );

};

GKK 13CASC

Solution: Fix The Grammar

Added the “abstract” keyword♦ Compiler issues error if a method is undefined and

class is not declared abstractAdded the “implements-all” keyword♦ declares all

methods as overridden

♦ saves user typing

interface Foo { int doThis( in int i );int doThat( in int i );

}

class Bar implements Foo { int doThis( in int i );

};

class Grille implements Foo { int doThis( in int i );int doThat( in int i );

};

interface Foo { int doThis( in int i );int doThat( in int i );

}

abstract

class Grille implements-all Foo// int doThis( in int i );// int doThat( in int i );

class Bar implements Foo { int doThis( in int i );

};

class Grille implements Foo { int doThis( in int i );int doThat( in int i );

};

interface Foo { int doThis( in int i );int doThat( in int i );

}

abstract class Bar implements Foo { int doThis( in int i );

};

{

};

GKK 14CASC

Problem: Managing all the Files

Babel creates many source files

foo.sidl

foo.f

foo_ior.c

foo_ior.h foo_skel.h

foo_skel.cc

foo_impl.h

foo_impl.ccfoo_stub.c

foo_stub.h

one set for eachclass & interface

GKK 15CASC

Solution: Babel Generates Makefile Macros

A “babel.make” file is generated

Users include it into their own makefiles♦ They control the build rules♦ We provide the file names

IORSRCS = foo_ior.c \bar_ior.c \grille_ior.c

IORHDRS = foo_ior.h \bar_ior.h \grille_ior.h

GKK 16CASC

Problem: Incremental Development

Library Developer would do the following:♦ write SIDL file♦ run Babel to generate bindings♦ hand edit “Impl” files to call their library code

#include “mylib.h”

int impl_Foo_doThis( Foo * self, const int i ) {

return mylib_Foo_doThis( (mylib_Foo*) self->userdata, i );

}

GKK 17CASC

Problem: Incremental Development (2)

Now assume this was done for 20 classes, each with 20 methods.Now assume a class needed a 21st methodBabel would regenerate all files and wipe out Developer’s edits#include “mylib.h”

int impl_Foo_doThis( Foo * self, const int i ) {

return mylib_Foo_doThis( (mylib_Foo*) self->userdata, i );

}

GKK 18CASC

Solution: Code Splicing

Added preservation of developer’s editsCode Splicer works line-by-line ♦ interleaves old code into new code♦ looks for begin-end pairs embedded in comments/* DO NOT DELETE splicer.begin( user-includes ) */#include “mylib.h”/* DO NOT DELETE splicer.end( user-includes ) */

int impl_Foo_doThis( Foo * self, const int i ) {/* DO NOT DELETE splicer.begin( Foo_doThis ) */return mylib_Foo_doThis(

(mylib_Foo*) self->userdata, i );

/* DO NOT DELETE splicer.end( Foo_doThis ) */}

GKK 19CASC

Results

Call hypre♦from C, F77, or C++♦on SPARC Solaris or DEC/OSF♦(more languages & platforms coming)

No interference with MPIBabel overhead within runtime noise

GKK 20CASC

Best Result: Change of Architecture

MPI

“official” hypreinterface (ANSI C)

F77 PythonC++ Python

MPI

F77 C++ANSI C

Babel Runtime

“official” interface

GKK 21CASC

Reasons for Change

Babel enforces regularity in codeLiked automatic reference counting Excellent compromise between:♦ Wanting

polymorphism and OO techniques

♦ Wanting all ANSI C for maximum portability

Liked using the toolNo Hand F77 bindings♦ incompatible♦ outdated

Preferred discussing designs in SIDL♦ easy for email♦ impossible to mix

implementation & interface

Convinced of Babel’s longevity

GKK 22CASC

Current & Future Work

Language Support♦ Current: C, C++, F77, Python (Client)♦ Coming: Python(Server), Java, F90, Matlab

Platform Independence♦ Implies RMI / Distributed Computing♦ SOAP

Parallel Data Redistribution Babelization efforts in LLNL♦ hypre♦ SAMRAI♦ ALPS

GKK 23CASC

Our Websitehttp://www.llnl.gov/CASC/components♦Alexandria (Component Repository)♦Quorum (Online Voting)♦Generic Parallel Redistribution

hyprehttp://www.llnl.gov/CASC/hypre

GKK 24CASC

UCRL-VG-140349 Rev 1

Work performed under the auspices of the U. S. Department of Energy by Lawrence Livermore National Laboratory under Contract W-7405-Eng-48

GKK 25CASC

Key to Babel’s Interoperability...

SIDLScientific Interface

Definition Language

IORIntermediate Object

Representation

XMLeXtensible Markup

Language

Human Compat

b Compatible

Compiler Compatibleible

We

GKK 26CASC

CORBALanguage IndependentWide Industry AcceptancePrimarily RemotingArchitecture

COMLanguage IndependentMost Established In Process OptimizationNetwork Transparent

Enterprise Java Beans (EJB)Platform IndependentRuns wherever Java does

Business Component Frameworks

GKK 27CASC

Business Component FrameworksScience

CORBALanguage IndependentWide Industry AcceptancePrimarily RemotingArchitectureHuge StandardNo In-Process Optimization

COMLanguage IndependentMost Established In Process OptimizationNetwork Transparentnot Microsoft TransparentRelies on sophisticated development tools

Enterprise Java Beans (EJB)Platform IndependentRuns wherever Java doesLanguage SpecificPotentially highest overhead

All The AboveNo Complex IntrinsicDatatypeNo Dynamic Multidimensional ArraysNo Fortran77/90/95 bindingsNo Parallel ComponentsNo Concept of SPMD Programming