Merge "Runtime detection of available processor cores."
This commit is contained in:
commit
aeb86d615c
@ -980,6 +980,9 @@ EOF
|
|||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# for sysconf(3) and friends.
|
||||||
|
check_header unistd.h
|
||||||
|
|
||||||
# glibc needs these
|
# glibc needs these
|
||||||
if enabled linux; then
|
if enabled linux; then
|
||||||
add_cflags -D_LARGEFILE_SOURCE
|
add_cflags -D_LARGEFILE_SOURCE
|
||||||
|
1
configure
vendored
1
configure
vendored
@ -211,6 +211,7 @@ HAVE_LIST="
|
|||||||
alt_tree_layout
|
alt_tree_layout
|
||||||
pthread_h
|
pthread_h
|
||||||
sys_mman_h
|
sys_mman_h
|
||||||
|
unistd_h
|
||||||
"
|
"
|
||||||
CONFIG_LIST="
|
CONFIG_LIST="
|
||||||
external_build
|
external_build
|
||||||
|
@ -17,9 +17,54 @@
|
|||||||
#include "vp8/common/idct.h"
|
#include "vp8/common/idct.h"
|
||||||
#include "vp8/common/onyxc_int.h"
|
#include "vp8/common/onyxc_int.h"
|
||||||
|
|
||||||
|
#if CONFIG_MULTITHREAD
|
||||||
|
#if HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#elif defined(_WIN32)
|
||||||
|
#include <windows.h>
|
||||||
|
typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
extern void vp8_arch_x86_common_init(VP8_COMMON *ctx);
|
extern void vp8_arch_x86_common_init(VP8_COMMON *ctx);
|
||||||
extern void vp8_arch_arm_common_init(VP8_COMMON *ctx);
|
extern void vp8_arch_arm_common_init(VP8_COMMON *ctx);
|
||||||
|
|
||||||
|
#if CONFIG_MULTITHREAD
|
||||||
|
static int get_cpu_count()
|
||||||
|
{
|
||||||
|
int core_count = 16;
|
||||||
|
|
||||||
|
#if HAVE_UNISTD_H
|
||||||
|
#if defined(_SC_NPROCESSORS_ONLN)
|
||||||
|
core_count = sysconf(_SC_NPROCESSORS_ONLN);
|
||||||
|
#elif defined(_SC_NPROC_ONLN)
|
||||||
|
core_count = sysconf(_SC_NPROC_ONLN);
|
||||||
|
#endif
|
||||||
|
#elif defined(_WIN32)
|
||||||
|
{
|
||||||
|
PGNSI pGNSI;
|
||||||
|
SYSTEM_INFO sysinfo;
|
||||||
|
|
||||||
|
/* Call GetNativeSystemInfo if supported or
|
||||||
|
* GetSystemInfo otherwise. */
|
||||||
|
|
||||||
|
pGNSI = (PGNSI) GetProcAddress(
|
||||||
|
GetModuleHandle(TEXT("kernel32.dll")), "GetNativeSystemInfo");
|
||||||
|
if (pGNSI != NULL)
|
||||||
|
pGNSI(&sysinfo);
|
||||||
|
else
|
||||||
|
GetSystemInfo(&sysinfo);
|
||||||
|
|
||||||
|
core_count = sysinfo.dwNumberOfProcessors;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
/* other platforms */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return core_count > 0 ? core_count : 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void vp8_machine_specific_config(VP8_COMMON *ctx)
|
void vp8_machine_specific_config(VP8_COMMON *ctx)
|
||||||
{
|
{
|
||||||
#if CONFIG_RUNTIME_CPU_DETECT
|
#if CONFIG_RUNTIME_CPU_DETECT
|
||||||
@ -88,4 +133,7 @@ void vp8_machine_specific_config(VP8_COMMON *ctx)
|
|||||||
vp8_arch_arm_common_init(ctx);
|
vp8_arch_arm_common_init(ctx);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_MULTITHREAD
|
||||||
|
ctx->processor_core_count = get_cpu_count();
|
||||||
|
#endif /* CONFIG_MULTITHREAD */
|
||||||
}
|
}
|
||||||
|
@ -194,6 +194,9 @@ typedef struct VP8Common
|
|||||||
|
|
||||||
#if CONFIG_RUNTIME_CPU_DETECT
|
#if CONFIG_RUNTIME_CPU_DETECT
|
||||||
VP8_COMMON_RTCD rtcd;
|
VP8_COMMON_RTCD rtcd;
|
||||||
|
#endif
|
||||||
|
#if CONFIG_MULTITHREAD
|
||||||
|
int processor_core_count;
|
||||||
#endif
|
#endif
|
||||||
struct postproc_state postproc_state;
|
struct postproc_state postproc_state;
|
||||||
} VP8_COMMON;
|
} VP8_COMMON;
|
||||||
|
@ -439,12 +439,18 @@ void vp8_decoder_create_threads(VP8D_COMP *pbi)
|
|||||||
|
|
||||||
pbi->b_multithreaded_rd = 0;
|
pbi->b_multithreaded_rd = 0;
|
||||||
pbi->allocated_decoding_thread_count = 0;
|
pbi->allocated_decoding_thread_count = 0;
|
||||||
core_count = (pbi->max_threads > 16) ? 16 : pbi->max_threads;
|
|
||||||
|
/* limit decoding threads to the max number of token partitions */
|
||||||
|
core_count = (pbi->max_threads > 8) ? 8 : pbi->max_threads;
|
||||||
|
|
||||||
|
/* limit decoding threads to the available cores */
|
||||||
|
if (core_count > pbi->common.processor_core_count)
|
||||||
|
core_count = pbi->common.processor_core_count;
|
||||||
|
|
||||||
if (core_count > 1)
|
if (core_count > 1)
|
||||||
{
|
{
|
||||||
pbi->b_multithreaded_rd = 1;
|
pbi->b_multithreaded_rd = 1;
|
||||||
pbi->decoding_thread_count = core_count -1;
|
pbi->decoding_thread_count = core_count - 1;
|
||||||
|
|
||||||
CHECK_MEM_ERROR(pbi->h_decoding_thread, vpx_malloc(sizeof(pthread_t) * pbi->decoding_thread_count));
|
CHECK_MEM_ERROR(pbi->h_decoding_thread, vpx_malloc(sizeof(pthread_t) * pbi->decoding_thread_count));
|
||||||
CHECK_MEM_ERROR(pbi->h_event_start_decoding, vpx_malloc(sizeof(sem_t) * pbi->decoding_thread_count));
|
CHECK_MEM_ERROR(pbi->h_event_start_decoding, vpx_malloc(sizeof(sem_t) * pbi->decoding_thread_count));
|
||||||
|
@ -459,15 +459,15 @@ void vp8cx_create_encoder_threads(VP8_COMP *cpi)
|
|||||||
|
|
||||||
cpi->b_multi_threaded = 0;
|
cpi->b_multi_threaded = 0;
|
||||||
cpi->encoding_thread_count = 0;
|
cpi->encoding_thread_count = 0;
|
||||||
cpi->processor_core_count = 32; //vp8_get_proc_core_count();
|
|
||||||
|
|
||||||
if (cpi->processor_core_count > 1 && cpi->oxcf.multi_threaded > 1)
|
if (cm->processor_core_count > 1 && cpi->oxcf.multi_threaded > 1)
|
||||||
{
|
{
|
||||||
int ithread;
|
int ithread;
|
||||||
int th_count = cpi->oxcf.multi_threaded - 1;
|
int th_count = cpi->oxcf.multi_threaded - 1;
|
||||||
|
|
||||||
if (cpi->oxcf.multi_threaded > cpi->processor_core_count)
|
/* don't allocate more threads than cores available */
|
||||||
th_count = cpi->processor_core_count - 1;
|
if (cpi->oxcf.multi_threaded > cm->processor_core_count)
|
||||||
|
th_count = cm->processor_core_count - 1;
|
||||||
|
|
||||||
/* we have th_count + 1 (main) threads processing one row each */
|
/* we have th_count + 1 (main) threads processing one row each */
|
||||||
/* no point to have more threads than the sync range allows */
|
/* no point to have more threads than the sync range allows */
|
||||||
|
@ -576,7 +576,6 @@ typedef struct
|
|||||||
// multithread data
|
// multithread data
|
||||||
int * mt_current_mb_col;
|
int * mt_current_mb_col;
|
||||||
int mt_sync_range;
|
int mt_sync_range;
|
||||||
int processor_core_count;
|
|
||||||
int b_multi_threaded;
|
int b_multi_threaded;
|
||||||
int encoding_thread_count;
|
int encoding_thread_count;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user