]> granicus.if.org Git - libx264/commitdiff
--threads=auto to detect number of cpus
authorLoren Merritt <pengvado@videolan.org>
Tue, 1 Aug 2006 00:17:18 +0000 (00:17 +0000)
committerLoren Merritt <pengvado@videolan.org>
Tue, 1 Aug 2006 00:17:18 +0000 (00:17 +0000)
git-svn-id: svn://svn.videolan.org/x264/trunk@543 df754926-b1dd-0310-bc7b-ec298dee348c

Makefile
common/common.c
common/cpu.c
common/cpu.h
encoder/encoder.c

index 2f3ed3435156102cc50352f61197b5a1646b621b..fdce903ab72123cc616473acd28f72a3a4b112cb 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -117,7 +117,7 @@ fprofiled:
        mv config.mak config.mak2
        sed -e 's/CFLAGS.*/& -fprofile-generate/; s/LDFLAGS.*/& -fprofile-generate/' config.mak2 > config.mak
        $(MAKE) x264$(EXE)
-       $(foreach V, $(VIDS), $(foreach I, 0 1 2, ./x264$(EXE) $(OPT$I) $(V) --progress -o $(DEVNULL) ;))
+       $(foreach V, $(VIDS), $(foreach I, 0 1 2, ./x264$(EXE) $(OPT$I) $(V) --progress --threads auto -o $(DEVNULL) ;))
        rm -f $(SRC2:%.c=%.o)
        sed -e 's/CFLAGS.*/& -fprofile-use/; s/LDFLAGS.*/& -fprofile-use/' config.mak2 > config.mak
        $(MAKE)
index d67dc563872c461ed7141c70abbc9e3cdd946cba..dd0825ede1357474feee1400a57df952e45a1301 100644 (file)
@@ -200,7 +200,12 @@ int x264_param_parse( x264_param_t *p, const char *name, const char *value )
     OPT("asm")
         p->cpu = atobool(value) ? x264_cpu_detect() : 0;
     OPT("threads")
-        p->i_threads = atoi(value);
+    {
+        if( !strcmp(value, "auto") )
+            p->i_threads = 0;
+        else
+            p->i_threads = atoi(value);
+    }
     OPT("level")
     {
         if( atof(value) < 6 )
index be05806d061aa18fe3cb1b25ae7f113134feef15..f4585d0c0e7745d135797622fac70661c95cce1e 100644 (file)
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  *****************************************************************************/
 
+#if defined(HAVE_PTHREAD) && defined(SYS_LINUX)
+#define _GNU_SOURCE
+#include <sched.h>
+#endif
+
 #include <string.h>
 
 #include "common.h"
@@ -143,3 +148,29 @@ void     x264_cpu_restore( uint32_t cpu )
 }
 
 #endif
+
+#if defined(HAVE_PTHREAD) && ( defined(SYS_LINUX) || defined(WIN32) )
+
+int x264_cpu_num_processors( void )
+{
+    int np;
+#if defined(WIN32)
+    uint32_t p_aff, s_aff;
+    GetProcessAffinityMask( GetCurrentProcess(), &p_aff, &s_aff );
+#else
+    uint64_t p_aff;
+    sched_getaffinity( 0, sizeof(p_aff), (cpu_set_t*)&p_aff );
+#endif
+    for( np = 0; p_aff != 0; p_aff >>= 1 )
+        np += p_aff&1;
+    return np;
+}
+
+#else
+
+int x264_cpu_num_processors( void )
+{
+    return 1;
+}
+
+#endif
index a9df3f836868d271b7ab68081db0e57d83262679..94101e528384c99a242ca454af370302dff8aa0c 100644 (file)
@@ -25,6 +25,7 @@
 #define _CPU_H 1
 
 uint32_t x264_cpu_detect( void );
+int      x264_cpu_num_processors( void );
 
 /* probably MMX(EXT) centric but .... */
 void     x264_cpu_restore( uint32_t cpu );
index c9b464c60221117247d9a7b8561fe5b0e0107d33..edadd01f6e4387e4978e692c9a5665fa67843831 100644 (file)
@@ -331,6 +331,8 @@ static int x264_validate_parameters( x264_t *h )
         return -1;
     }
 
+    if( h->param.i_threads == 0 )
+        h->param.i_threads = x264_cpu_num_processors();
     h->param.i_threads = x264_clip3( h->param.i_threads, 1, X264_SLICE_MAX );
     h->param.i_threads = X264_MIN( h->param.i_threads, (h->param.i_height + 15) / 16 );
 #ifndef HAVE_PTHREAD