It is likely that this is related to using higher-precision FPU registers, in which case there is a portable solution: look up SAFE_FFLAGS in 'Writing R Extensions'.

But if that is the cause, the real solution is to write the code using proper convergence tests.

On Sat, 23 May 2009, Kasper Daniel Hansen wrote:


On May 20, 2009, at 4:32 , Seija Sirkiä wrote:

Hello again,

thank you for the comments, especially this one:

Prof Brian Ripley wrote:

My concern would be that there are different cases that fail under
Fortran compiler X and you are just sweeping the problem under the
carpet.

It inspired us to go back to search the cause, and we've made some progress: it's not the compiler, it's the compiler options. Simple, but it took a while to figure that out since my experience in these things is limited. When I build the package with default options using INSTALL --build the dll is built with option -O3 as per R's Makeconfig file. If I build the dll by hand, using gfortran with no additional options and dyn.load it, everything works, and also with -O and -Os. (No, I don't fully understand what the differences between all these are, but that's another question).

I'm looking at chapter 5.5 in Writing R Extensions and also 6.3.3 in R Installation and Administration but I can't figure out how to tell "inside" my package that it is not to be built -O3 but with, say, -O. I can see how to add flags in the package (and as far as I can tell, if there are several optimization level flags the last in line is used and that's the wrong one from my point of view), and also how to override flags but only on my computer. Am I blind or am I again attempting something I shouldn't?


This is not trivial, and how you do it is compiler dependent. A quick fix was provided by Simon Urbanek a while back and it is _not_ portable, it assumes you are using GCC. It would be nice to have a configure file that detects the compiler and optimization setting and then re-sets the optimization level. I have thought about writing one, but have never got around to do it.

Anyway, the fix is in the Makevars file from affxparser from Bioconductor. Essentially, you use a Makevars file placed in the src directory, containing

MYCXXFLAGS=-O0 -Wall

%.o: %.cpp
      $(CXX) $(ALL_CPPFLAGS) $(ALL_CXXFLAGS) $(MYCXXFLAGS) -c $< -o $@

Essentially this makes sure that -O0 (indicating no optimization) is placed at the _end_ of the call to the compiler (this is for C++ files btw), using the fact that if you have two -O* settings, the last one overrides the first.

This ought to be easily adaptable to FORTRAN.

Kasper

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

--
Brian D. Ripley,                  rip...@stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to