better nprocs guessing
This commit is contained in:
parent
55d78a4dcf
commit
223c964496
@ -34,6 +34,7 @@
|
|||||||
improves SMP scaling for narrow images on many-way machines
|
improves SMP scaling for narrow images on many-way machines
|
||||||
- default to max number of processors (--vips-concurrency and IM_CONCURRENCY
|
- default to max number of processors (--vips-concurrency and IM_CONCURRENCY
|
||||||
set >0 can override) on linux and win32
|
set >0 can override) on linux and win32
|
||||||
|
- better nprocs guesser
|
||||||
|
|
||||||
15/1/10 started 7.21.1
|
15/1/10 started 7.21.1
|
||||||
- added "written" callbacks, used to implement write to non-vips formats
|
- added "written" callbacks, used to implement write to non-vips formats
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
* - gtkdoc
|
* - gtkdoc
|
||||||
* 14/3/10
|
* 14/3/10
|
||||||
* - scale nlines with nthr for smalltile
|
* - scale nlines with nthr for smalltile
|
||||||
|
* - better nprocs guesser
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -138,6 +139,69 @@ im_concurrency_set( int concurrency )
|
|||||||
im__concurrency = concurrency;
|
im__concurrency = concurrency;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
get_num_processors( void )
|
||||||
|
{
|
||||||
|
int nproc;
|
||||||
|
|
||||||
|
nproc = 1;
|
||||||
|
|
||||||
|
#ifdef G_OS_UNIX
|
||||||
|
|
||||||
|
#if defined(HAVE_UNISTD_H) && defined(_SC_NPROCESSORS_ONLN)
|
||||||
|
{
|
||||||
|
/* POSIX style.
|
||||||
|
*/
|
||||||
|
int x;
|
||||||
|
|
||||||
|
x = sysconf( _SC_NPROCESSORS_ONLN );
|
||||||
|
if( x > 0 )
|
||||||
|
nproc = x;
|
||||||
|
}
|
||||||
|
#elif defined HW_NCPU
|
||||||
|
{
|
||||||
|
/* BSD style.
|
||||||
|
*/
|
||||||
|
int x;
|
||||||
|
size_t len = sizeof(x);
|
||||||
|
|
||||||
|
sysctl( (int[2]) {CTL_HW, HW_NCPU}, 2, &x, &len, NULL, 0 );
|
||||||
|
if( x > 0 )
|
||||||
|
nproc = x;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* libgomp has some very complex code on Linux to count the number of
|
||||||
|
* processors available to the current process taking pthread affinity
|
||||||
|
* into account, but we don't attempt that here. Perhaps we should?
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /*G_OS_UNIX*/
|
||||||
|
|
||||||
|
#ifdef OS_WIN32
|
||||||
|
{
|
||||||
|
/* Count the CPUs currently available to this process.
|
||||||
|
*/
|
||||||
|
DWORD_PTR process_cpus;
|
||||||
|
DWORD_PTR system_cpus;
|
||||||
|
|
||||||
|
if( GetProcessAffinityMask( GetCurrentProcess(),
|
||||||
|
&process_cpus, &system_cpus ) ) {
|
||||||
|
unsigned int count;
|
||||||
|
|
||||||
|
for( count = 0; process_cpus != 0; process_cpus >>= 1 )
|
||||||
|
if( process_cpus & 1 )
|
||||||
|
count++;
|
||||||
|
|
||||||
|
if( count > 0 )
|
||||||
|
nproc = count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /*OS_WIN32*/
|
||||||
|
|
||||||
|
return( nproc );
|
||||||
|
}
|
||||||
|
|
||||||
/* Set (p)thr_concurrency() from IM_CONCURRENCY environment variable. Return
|
/* Set (p)thr_concurrency() from IM_CONCURRENCY environment variable. Return
|
||||||
* the number of regions we should pass over the image.
|
* the number of regions we should pass over the image.
|
||||||
*/
|
*/
|
||||||
@ -155,23 +219,8 @@ im_concurrency_get( void )
|
|||||||
else if( (str = g_getenv( IM_CONCURRENCY )) &&
|
else if( (str = g_getenv( IM_CONCURRENCY )) &&
|
||||||
(x = atoi( str )) > 0 )
|
(x = atoi( str )) > 0 )
|
||||||
nthr = x;
|
nthr = x;
|
||||||
else {
|
else
|
||||||
nthr = 1;
|
nthr = get_num_processors();
|
||||||
#ifdef HAVE_SYSCONF
|
|
||||||
{
|
|
||||||
x = sysconf( _SC_NPROCESSORS_ONLN );
|
|
||||||
if( x > 0 )
|
|
||||||
nthr = x;
|
|
||||||
}
|
|
||||||
#endif /*HAVE_SYSCONF*/
|
|
||||||
#ifdef OS_WIN32
|
|
||||||
SYSTEM_INFO si;
|
|
||||||
|
|
||||||
GetSystemInfo( &si );
|
|
||||||
|
|
||||||
nthr = si.dwNumberOfProcessors;
|
|
||||||
#endif /*OS_WIN32*/
|
|
||||||
}
|
|
||||||
|
|
||||||
if( nthr < 1 || nthr > IM_MAX_THREADS ) {
|
if( nthr < 1 || nthr > IM_MAX_THREADS ) {
|
||||||
nthr = IM_CLIP( 1, nthr, IM_MAX_THREADS );
|
nthr = IM_CLIP( 1, nthr, IM_MAX_THREADS );
|
||||||
@ -184,35 +233,6 @@ im_concurrency_get( void )
|
|||||||
*/
|
*/
|
||||||
im_concurrency_set( nthr );
|
im_concurrency_set( nthr );
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
FIXME .. hmm
|
|
||||||
|
|
||||||
#ifdef SOLARIS_THREADS
|
|
||||||
if( thr_setconcurrency( nthr + 1 ) ) {
|
|
||||||
im_error( "im_concurrency_get", _( "unable to set "
|
|
||||||
"concurrency level to %d" ), nthr + 1 );
|
|
||||||
return( -1 );
|
|
||||||
}
|
|
||||||
#ifdef DEBUG_IO
|
|
||||||
printf( "im_generate: using thr_setconcurrency(%d)\n", nthr+1 );
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_PTHREAD
|
|
||||||
#ifdef HAVE_PTHREAD_SETCONCURRENCY
|
|
||||||
if( pthread_setconcurrency( nthr + 1 ) ) {
|
|
||||||
im_error( "im_concurrency_get", _( "unable to set "
|
|
||||||
"concurrency level to %d" ), nthr + 1 );
|
|
||||||
return( -1 );
|
|
||||||
}
|
|
||||||
#ifdef DEBUG_IO
|
|
||||||
printf( "im_generate: using pthread_setconcurrency(%d)\n", nthr+1 );
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
|
|
||||||
return( nthr );
|
return( nthr );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user