caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Maurice.Bremond@inria.fr (Maurice Bremond)
To: Jan Kybic <kybic@fel.cvut.cz>
Cc: caml-list@yquem.inria.fr
Subject: Re: [Caml-list] Ocaml <-> Matlab interface
Date: Thu, 05 Feb 2009 15:48:32 +0100	[thread overview]
Message-ID: <rxsiqnpey7z.fsf@inria.fr> (raw)
In-Reply-To: <87myd2nzlm.fsf@fel.cvut.cz> (Jan Kybic's message of "Wed\, 04 Feb 2009 13\:41\:41 +0100")



Hello,


>I am posting below the relevant excerpts
>from my code in case somebody can spot the problem.
Unfortunately, if I try one of the two tests (*1*) and (*2*) below, I
cannot reproduce your segfault (ocamlmex 2.1.0 and my Matlab version
is 7.7.0.471 (R2008b))

What you can do is :

 - run these two tests 
   (simply replace example/camlp5o/hello.ml by each of them)
   for (*1*) at the Matlab prompt : 
   >> for i = 1:10000; hello(hello(hello(hello(single([1:1000,1:1000])))));end
   (the goal is to trigger the caml gc several times without calling
   it explicitly)

   (*2*) :
   >> for i = 1:1000; hello; end

 - if you have not already ran the test suite : 
   make test 
   and at Matlab prompt :
   >> cd <ocamlmexdir>/test
   >> api('check')
   Everything should be ok.

 - put some Gc.full_major() in your MEX-files to see if a crash occurs
   (it should not!).

Other hints :

 - if you use Matlab callbacks (Mex.mexCallMATLAB) you can have some
   segmentation violations if you call Matlab function with a wrong
   number of arguments (I think this is a Matlab problem that cannot
   be prevented) see (*3*)

 - any interruption during Mex.mexCallMATLAB may be fatal to the
   Matlab session.

 - if you do not use specific Matlab callbacks, maybe have a try with
   Octave (>=3.0) (./configure BASE=OCTAVE; make ; make install)
  
 - I had segv problems with an old version of Matlab (<= ~R2006x).
 

Please, mail me directly about this (there is no ocamlmex user list)
and if you can, send me a full segv example. 


>Matlab and Ocaml run as separate processes and communicate using Unix
>named pipes (created using mkfifo)
This sounds like the Matlab engine api :
http://www.mathworks.com/access/helpdesk/help/techdoc/index.html?/access/helpdesk/help/techdoc/matlab_external/f29148.html

A limited binding to the Matlab engine api is in ocamlmex, under
src/eng. It has not really been tested and maybe it can be improved.


Maurice Bremond



Examples:

(*1*)
open Bigarray

let _ = 
  Mex.mexRegister (function
  |  a when Array.length(a) > 1 || Array.length(a) = 0 -> [| |]
  |  a -> let speedm = a.(0) in
    match Mex.mxGetData speedm with
    | Mex.FLOAT32 s -> 
        (try
          let x = array2_of_genarray s in
          let dims = Mex.mxGetDimensions speedm in 
          let r = Mex.mxCreateNumericArray [| dims.(0) ; dims.(1) |] 
              Mex.SINGLE_CLASS Mex.REAL in
          Mex.mxSetData r (Mex.FLOAT32 s);
          [| r |]
        with Invalid_argument _ ->
          failwith "Input is not a 2D array.")
    | _ ->  failwith "Input is not float32 (class single).")
  

(*2*)
open Bigarray

let _ = 
  Mex.mexRegister (function
    |  [| |]  -> 
        let n,m = 1000,1000 in
        let r = Mex.mxCreateNumericArray [| n ; m |] Mex.DOUBLE_CLASS Mex.REAL in
        let a = Array2.create float64 fortran_layout n m in
        for j = 1 to m do
          for i = 1 to n do
            a.{i,j} <- float_of_int (i+j) ;
          done ;
        done ;
        Mex.mxSetData r (Mex.FLOAT64 (genarray_of_array2 a)) ;
        [| r |]
    | _ -> failwith "bad args")


(*3*)
  (* segmentation violation *)
   let _ =
     mexRegister
      (function
        [| a; b; c |] ->
          mexCallMATLAB 3 [| (mexCallMATLAB 4 [| a; |] "plus").(0); c |]
            "mtimes"
        | _ -> raise (Failure "bad args"))






      reply	other threads:[~2009-02-05 14:49 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-02-04 12:41 Jan Kybic
2009-02-05 14:48 ` Maurice Bremond [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=rxsiqnpey7z.fsf@inria.fr \
    --to=maurice.bremond@inria.fr \
    --cc=caml-list@yquem.inria.fr \
    --cc=kybic@fel.cvut.cz \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).