Monday, November 22, 2010

MathLink Example 0

MathLink is a protocol on how to communicate Mathematica with external programs. For example, one would like to run compiled code in C within the Mathematica environment.  I am going to post a sequence of MathLink programs for Linux with an increasing level of complexity, starting from a simple example already found in the Mathematica help (included for completeness) finishing with an example where I send and receive a matrix of complex numbers processed by the GPU using CUDA

Most examples are made of 4 files:
  • *.c             : where the computation occurs.
  • *.tm          : MathLink template where the input and output are specified and the documentation of the function is placed. 
  • Makefile   : where the compilation sequence is specified
  • *.nb          : Mathematica notebook that executes the whole program
These files have to be placed in the same folder and compiled with: $make , which may need editing in order to provide the path of the executable file mprep that comes as part of Mathematica. 
As seen in Makefile, mprep generates a proper *.c code from the *.tm file, which is compiled along with the *.c file that contains the computational process.

The first example adds two integers


#include "mathlink.h"
extern int addtwo( int i, int j);

int addtwo( int i, int j)

 return i+j;


#if __BORLANDC__
#pragma argsused

int PASCAL WinMain( HINSTANCE hinstCurrent, HINSTANCE hinstPrevious, LPSTR lpszCmdLine, int nCmdShow)

 char  buff[512];
 char FAR * buff_start = buff;

 char FAR * argv[32];
 char FAR * FAR * argv_end = argv + 32;

 hinstPrevious = hinstPrevious; /* suppress warning */

 if( !MLInitializeIcon( hinstCurrent, nCmdShow)) return 1;

 MLScanString( argv, &argv_end, &lpszCmdLine, &buff_start);
 return MLMain( (int)(argv_end - argv), argv);


int main(int argc, char* argv[])

 return MLMain(argc, argv);



int addtwo P(( int, int));

:Function:       addtwo

:Pattern:        AddTwo[i_Integer, j_Integer]
:Arguments:      { i, j }
:ArgumentTypes:  { Integer, Integer }
:ReturnType:     Integer


:Evaluate: AddTwo::usage = "AddTwo[x, y] gives the sum of two machine integers x and y."


MPREP = /usr/bin/mprep
CXX = /usr/bin/c++

BINARIES = addtwo

all : $(BINARIES)

addtwo : addtwotm.c addtwo.c
 ${CXX}  addtwotm.c addtwo.c  -lML64i3 -lm -lpthread -lrt -lstdc++ -o $@

addtwotm.c :
 ${MPREP} -o addtwotm.c


link = Install["./addtwo"]


AddTwo[2, 3]

1 comment:

  1. can any one help me to write the sample programm for mathlink C#...