> for (i=start; i<=stop; i++) { /* i is private by default */ > > scm_init_guile(); > scm_call_1( func , scm_from_int(i) ); IIUC, you are calling scm_init_guile once per index, whereas calling it once per thread would suffice. For better performance, I propose doing it once per thread. On 13-01-2023 12:10, Damien Mattei wrote: > there should be difference in implementation of Guile between Mac OS and > Linux but i do not know the inner mechanism and algorithm used to run > Guile in a C environment,what  scm_init_guile() is doing? Guile is free software, you can download the source code to read what scm_init_guile is doing. > why must it be placed under the // region on Linux (with slower result) From the manual: 6.4 Each thread that wants to use functions from the Guile API needs to put itself into guile mode with either ‘scm_with_guile’ or ‘scm_init_guile’. The global state of Guile is initialized automatically when the first thread enters guile mode. OpenMP does multi-threading, so you need to call scm_init_guile or scm_with_guile. > and anywhere under MacOS ? (speed up code) You need to do it on non-Linux too -- the extract from the manual does not make a 'except on MacOS' exception. It might work without scm_init_guile in some circumstances, but this is not at all guaranteed. If you want to know the difference between MacOS and Linux in the implementation of scm_init_guile, you can read the source code of scm_init_guile as mentioned before. Greetings, Maxime.