From murdoch at stats.uwo.ca  Fri Sep  9 19:51:48 2005
From: murdoch at stats.uwo.ca (Duncan Murdoch)
Date: Fri, 09 Sep 2005 13:51:48 -0400
Subject: [Rd] A question on R memory management in .Fortran() calls
 under Windows
In-Reply-To: <3c12769c0509091004555400f@mail.gmail.com>
References: <3c12769c0509091004555400f@mail.gmail.com>
Message-ID: <4321CBB4.3090805@stats.uwo.ca>

On 9/9/2005 1:04 PM, Simone Giannerini wrote:
> Dear R community,
> 
> I have a question on how R manages memory allocation in .Fortran()
> calls under Windows.
> In brief, apparently, it is not possible to allocate large matrices
> inside a Fortran subroutine
>   unless you pass them as arguments. If you do not act in this way
> RGUI crashes with a stack overflow error and acting  on memory through
> vsize nsize ppsize and memory.limit does not help at all.

It looks as though your Fortran compiler is allocating the new matrix on 
the stack.  R doesn't give you a huge stack, and that's causing the 
overflow.  When you get R to do the allocation, it does it on the heap, 
which has no artificial limits.  Only a pointer to the object ends up on 
the stack.

I'd say your only reasonable workarounds are to tell your compiler to 
use the heap for the local matrix allocation (if that's possible), or do 
your allocations in R.

There might be some utility somewhere which can modify Rgui.exe to tell 
it to start with a larger stack, and there is probably some linker 
option to put one in place, but it's not really reasonable to increase 
R's stack, because in almost all other situations, writing that much 
data to the stack is a sign of an infinite recursion.

Duncan Murdoch

> 
> ****************************************************************************************
> Details of the configurations on which I performed testing follow:
> R 2.1.1 on WinXP Pro SP2 ITA 
> PC1: AMD 64 3700+ 1GB RAM 
> PC2: AMD AthlonXP 2400+ 512Mb RAM
> Compaq Visual Fortran pro 6.6C
> ****************************************************************************************
> 
> To give an idea I attach a brief example on how to reproduce this:
> Create two simple subroutines 'foo' and 'foobis' that, say, give the
> sum of the elements of a matrix:
> 
> *** file foo.f90 starts
> ***********************************************************************
> SUBROUTINE foo(X,M,N,S)
> !DEC$ ATTRIBUTES DLLEXPORT,C,REFERENCE,ALIAS:'foo_' :: FOO
> 
>     IMPLICIT NONE
>     integer:: M,N
>     real*8:: X(M,N),S
> 
>     S  = sum(X);
> 
> END SUBROUTINE foo
> 
> SUBROUTINE foobis(M,N,S)
> !DEC$ ATTRIBUTES DLLEXPORT,C,REFERENCE,ALIAS:'foobis_' :: FOOBIS
> 
>     IMPLICIT NONE
>     integer:: M,N
>     real*8:: X(M,N),S
>     X = 1;
>     S  = sum(X);
> 
> END SUBROUTINE foobis
> 
> *** file foo.f90 ends
> ***********************************************************************
> 
> Notice that the matrix X is an input argument in foo and an internal
> variable in foobis.
> After compiling and linking turn to R:
> **************************************************************************
>> dyn.load("foo.dll");
>> is.loaded(symbol.For("foo"));
> [1] TRUE
>> is.loaded(symbol.For("foobis"));
> [1] TRUE
>> M <- 10;
>> N <- 10;
>> X <- matrix(1,M,N);
>> .Fortran("foo",X,as.integer(M),as.integer(N),S=as.double(0))$S;
> [1] 100 
>> .Fortran("foobis",as.integer(M),as.integer(N),S=as.double(0))$S;
> [1] 100
> 
> ## no problem here with small matrices, let's increase the size
> 
>> M <- 3000;
>> N <- 100;
>> X <- matrix(1,M,N);
>> .Fortran("foo",X,as.integer(M),as.integer(N),S=as.double(0))$S;
> [1] 3e+05  ## OK
> 
> 
> .Fortran("foobis",as.integer(M),as.integer(N),S=as.double(0))$S;
> ##  *** R GUI CRASHES WITH A STACK OVERFLOW ERROR ***
> ****************************************************************************
> Any suggestion would be greatly appreciated, I apologize if this
> problem has already been addressed previously,  I did not notice it.
>  Many thanks in advance,
>  
>  Simone
> ______________________________________________________ 
> 
> Simone Giannerini
> Dipartimento di Scienze Statistiche "Paolo Fortunati"
> Universita' di Bologna
> Via delle belle arti 41 - 40126  Bologna,  ITALY
> Tel: +39 051 2098248  Fax: +39 051 232153
> E-mail: giannerini at stat.unibo.it
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



[Rd] A question on R memory management in .Fortran() calls under Windows
Duncan Murdoch