On 04/23/2015 03:36 AM, Volker Braun wrote: > I wouldn't want another environment variable for that.
Well, easier for playing than editing the sources... ;-) A good default value should be chosen automatically. > If we have to, > chunking at 10 would be fine. I think it's ok for machines with 2 to 4 GB (saw ~0.5 +/-0.1 GB with one process); if one uses more cores anyway, there's not really a problem (thumb rule 2 GB RAM / core), i.e., up to "unlimited" everything would be ok (until we add the next few hundred modules). > Though ideally this would be dealt with on > the cython side, I think the Sage library is kind of special, but a 10-fold increase in memory usage (with a single process) can't really be what upstream wants or should tolerate. There's presumably a slight gain through caching a lot, but apparently too much is kept, so I'd consider it a bug. -leif > I made a post here: > https://groups.google.com/d/msg/cython-users/7UoMj84Y5os/6UAXi64MA88J > > > On Wednesday, April 22, 2015 at 6:04:41 PM UTC-4, leif wrote: > > On 04/21/2015 11:57 PM, Andrey Novoseltsev wrote: > > It is a single core single thread 64-bit CPU (Athlon 64M), > suggestions > > to use USB 3/PCIe SSD are funny but miss the point: for no > apparent gain > > systems that were capable of building Sage can't do it anymore (or > > require tweaking to reduce parallelism). I find it quite worrisome > since > > the situation may continue to worsen if not fixed. Unfortunately, I > > personally can't do much as I have no clue what is going on and > how to > > debug it. > > Tentative patch (tested with Sage 6.6): > > diff --git a/src/setup.py b/src/setup.py > index 82bc8dd..c642242 100644 > --- a/src/setup.py > +++ b/src/setup.py > @@ -553,14 +553,40 @@ def run_cythonize(): > force = False > > global ext_modules > - ext_modules = cythonize( > - ext_modules, > - nthreads=int(os.environ.get('SAGE_NUM_THREADS', 0)), > - build_dir='build/cythonized', > - force=force, > - compiler_directives={ > - 'profile': profile, > - }) > + > + nthreads = int(os.environ.get('SAGE_NUM_THREADS', 0)) > + nmodules = int(os.environ.get('SAGE_CYTHONIZE_AT_ONCE', 0)) # 0 > means all / unlimited > + build_dir = 'build/cythonized' > + compiler_directives = { > + 'profile': profile, > + } > + > + > + if not nmodules: > + # cythonize all modules at once > + ext_modules = cythonize( > + ext_modules, > + nthreads=nthreads, > + build_dir=build_dir, > + force=force, > + compiler_directives=compiler_directives > + ) > + else: > + # cythonize module list in chunks of nmodules modules > + chunk_size = nmodules > + cythonized_modules = [] > + > + for i in range(0, len(ext_modules), chunk_size): > + cythonized_modules.extend( > + cythonize( > + ext_modules[i:i+chunk_size], > + nthreads=nthreads, > + build_dir=build_dir, > + force=force, > + compiler_directives=compiler_directives > + ) > + ) > + ext_modules = cythonized_modules > > open(version_file, 'w').write(version_stamp) > > > > One can try this with e.g. > > env SAGE_CYTHONIZE_AT_ONCE=10 ./sage -ba-force > > or > > export SAGE_CYTHONIZE_AT_ONCE=25 > make > > Setting SAGE_NUM_THREADS is orthogonal to setting > SAGE_CYTHONIZE_AT_ONCE; I originally wanted to (ab)use the former to > use > some randomly chosen small chunk size if its value is zero, but within > Sage it's always positive and this way is more flexible. > > If we really want to merge such a work-around, the new environment > variable (better names appreciated) needs to be documented, and we > should probably add some magic to automatically cythonize in chunks if > RAM or total memory is low, probably also based on the number of > cores / > the setting of SAGE_NUM_THREADS. > > > Have fun, > > -leif -- You received this message because you are subscribed to the Google Groups "sage-devel" group. To unsubscribe from this group and stop receiving emails from it, send an email to sage-devel+unsubscr...@googlegroups.com. To post to this group, send email to sage-devel@googlegroups.com. Visit this group at http://groups.google.com/group/sage-devel. For more options, visit https://groups.google.com/d/optout.