From patchwork Sat Jun 5 12:29:05 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thilo Borgmann X-Patchwork-Id: 28086 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp1935447iof; Sat, 5 Jun 2021 05:29:18 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzkd+K+a/OCq3MMR/UC1buwmgqzAld2up8gxnlJ0HEbPjxYlSKo4ujecKRWL28pmJop0DNn X-Received: by 2002:aa7:dc4c:: with SMTP id g12mr10279032edu.258.1622896157967; Sat, 05 Jun 2021 05:29:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1622896157; cv=none; d=google.com; s=arc-20160816; b=k8gByThl1aI4vkWPgLrDCNxZMVmsv7AAl5QVwQqyA4DStssDqoSk85UXfRHGFoU4rA fJWu8S79QuB7WmM5T9eWrN0A2PPO2KHQxGC9ugBNYkI8Nja+y/zwGK/ztBhwaL8ef5ZQ BdgUhkwAvFL7Ogd3T4fcaJ1Je+ONrefJ+8eCMjLMkq71qbm2MxD1EJu05wDlwpSGnzWJ i5achaFv7+6nGuQfvamAmH0LhSNgvZuTtWrmogAnVs98Dh7Kw8BSDSOYoVrcd5O5wpSM bXtxhnaCRLd/HRX5VeMf4nEsxLlpLVh1JylV0R7W/soumIrBgY8ZrSs2+n+BiA3QqF18 lfeA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject :content-language:mime-version:date:message-id:from:to :dkim-signature:delivered-to; bh=hr3iPSPBXzicgJ4EkgcRGA36a1tknKSO8qjIVqY4+bY=; b=xWgzcEMEKw+VrSF282kBKPFcutH+cOLS9EYEtA9Xfo3TBvMEaApZsc+uCUwQHludyn 0Z0WOLBJFBVESDek42CG9/a1cWBZ0nuuvV8CFfqPj/NT2sYuqkBoV53tXYu+pxNwzrwk orcpAGyZRr0Y5jPZkad4saUUL1aiwjRc84C40WiDVUHpvus5WnJ48Ydvqt78GN0oR+I0 RydAT8E0fegUbpvmuWvaihLFUjH7lvCVujncUu+MelRd0k/K/dlegM51MMPFVYXTkTi4 5cmVeKD0sNmCN/rrtCAzZArLVqhcMoS5ETrfGL/TVMOwS6Dt+E90pPXZYYl6trnSusfO /vVA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@mail.de header.s=mailde202009 header.b=1SDAmPE9; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mail.de Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 90si3326651edc.44.2021.06.05.05.29.17; Sat, 05 Jun 2021 05:29:17 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@mail.de header.s=mailde202009 header.b=1SDAmPE9; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mail.de Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5D7C768A407; Sat, 5 Jun 2021 15:29:14 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from shout02.mail.de (shout02.mail.de [62.201.172.25]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 25BF668A324 for ; Sat, 5 Jun 2021 15:29:07 +0300 (EEST) Received: from postfix01.mail.de (postfix02.bt.mail.de [10.0.121.126]) by shout02.mail.de (Postfix) with ESMTP id 7FEF7C0102 for ; Sat, 5 Jun 2021 14:29:06 +0200 (CEST) Received: from smtp01.mail.de (smtp01.bt.mail.de [10.0.121.211]) by postfix01.mail.de (Postfix) with ESMTP id 67DB2A0019 for ; Sat, 5 Jun 2021 14:29:06 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=mail.de; s=mailde202009; t=1622896146; bh=UYdvN2eIWDOZRtW+TWYRUKfnU9CYn90QOwH4Gyn4ZqA=; h=To:From:Subject:Date:From; b=1SDAmPE9R2e/YYVrJVTK7jbUtIwSECrt859MYeAAgn1n/iKn0U7Nv6uzeYyNUrDVJ n+y6ZfSwuhfa2D0P+R8CR5W9vhMFyWEIGwum9DO+ZiaKGvrctT43ajpl+0uTSxGhcs e2uUC8Q7FEjchxvy3/pFmv49FNGHOrzWqaJmS0mxrcKRrr++vn/6VIF98ZpBjZ0SfP WUgU7wJpzhgybHa6Bqcx8D6GhADSnh+VXph8JswiTHmTI53AfFH6sKOKkfSN/WlRLY poerDRTD2ScEV0ED9jtweiTFn82V9UxGeOJDgHY4G+L87nFrC4jKtzjcnmeR2PnEB3 YvREhmH2BkH9Q== Received: from [127.0.0.1] (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by smtp01.mail.de (Postfix) with ESMTPSA id 318871002D5 for ; Sat, 5 Jun 2021 14:29:05 +0200 (CEST) To: FFmpeg development discussions and patches From: Thilo Borgmann Message-ID: <5bf9410a-a108-0294-8c33-c7fc78e07c5f@mail.de> Date: Sat, 5 Jun 2021 14:29:05 +0200 MIME-Version: 1.0 Content-Language: en-US X-purgate: clean X-purgate: This mail is considered clean (visit http://www.eleven.de for further information) X-purgate-type: clean X-purgate-Ad: Categorized by eleven eXpurgate (R) http://www.eleven.de X-purgate: This mail is considered clean (visit http://www.eleven.de for further information) X-purgate: clean X-purgate-size: 8281 X-purgate-ID: 154282::1622896146-00004DA0-7BDC3751/0/0 Subject: [FFmpeg-devel] [PATCH] fftools/cmdutils.c: Add cmd line option to override detection of cpu count X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: Y7ks/NNDw57A Hi, add an option to override auto-detection of cpu count. Defaults to auto-detection, of course. -Thilo From 38612f3e1339354dbaa6be4f36072320ff71c707 Mon Sep 17 00:00:00 2001 From: Thilo Borgmann Date: Sat, 5 Jun 2021 14:26:23 +0200 Subject: [PATCH] fftools/cmdutils.c: Add cmd line option to override detection of cpu count Suggested-By: ffmpeg@fb.com --- doc/fftools-common-opts.texi | 7 +++++++ fftools/cmdutils.c | 27 +++++++++++++++++++++++++++ fftools/cmdutils.h | 7 +++++++ libavutil/cpu.c | 14 ++++++++++++++ libavutil/cpu.h | 6 ++++++ 5 files changed, 61 insertions(+) diff --git a/doc/fftools-common-opts.texi b/doc/fftools-common-opts.texi index 5260ecb8f3..7643dd8396 100644 --- a/doc/fftools-common-opts.texi +++ b/doc/fftools-common-opts.texi @@ -353,6 +353,13 @@ Possible flags for this option are: @end table @end table +@item -cpucount @var{count} (@emph{global}) +Override detection of CPU count. This option is intended +for testing. Do not use it unless you know what you're doing. +@example +ffmpeg -cpucount 2 +@end example + @item -max_alloc @var{bytes} Set the maximum size limit for allocating a block on the heap by ffmpeg's family of malloc functions. Exercise @strong{extreme caution} when using diff --git a/fftools/cmdutils.c b/fftools/cmdutils.c index 4eb68d2201..583a706e5d 100644 --- a/fftools/cmdutils.c +++ b/fftools/cmdutils.c @@ -72,6 +72,7 @@ AVDictionary *format_opts, *codec_opts, *resample_opts; static FILE *report_file; static int report_file_level = AV_LOG_DEBUG; int hide_banner = 0; +int cpu_count = -1; enum show_muxdemuxers { SHOW_DEFAULT, @@ -866,6 +867,32 @@ int opt_cpuflags(void *optctx, const char *opt, const char *arg) return 0; } +int opt_cpucount(void *optctx, const char *opt, const char *arg) +{ + int ret; + int count; + + static const AVOption opts[] = { + {"count", NULL, 0, AV_OPT_TYPE_INT, { .i64 = -1}, -1, INT_MAX, NULL}, + {NULL}, + }; + static const AVClass class = { + .class_name = "cpucount", + .item_name = av_default_item_name, + .option = opts, + .version = LIBAVUTIL_VERSION_INT, + }; + const AVClass *pclass = &class; + + ret = av_opt_eval_int(&pclass, opts, arg, &count); + + if (!ret) { + av_force_cpu_count(count); + } + + return ret; +} + int opt_loglevel(void *optctx, const char *opt, const char *arg) { const struct { const char *name; int level; } log_levels[] = { diff --git a/fftools/cmdutils.h b/fftools/cmdutils.h index 1917510589..29a45dd0be 100644 --- a/fftools/cmdutils.h +++ b/fftools/cmdutils.h @@ -50,6 +50,7 @@ extern AVDictionary *sws_dict; extern AVDictionary *swr_opts; extern AVDictionary *format_opts, *codec_opts, *resample_opts; extern int hide_banner; +extern int cpu_count; /** * Register a program-specific cleanup routine. @@ -88,6 +89,11 @@ void log_callback_help(void* ptr, int level, const char* fmt, va_list vl); */ int opt_cpuflags(void *optctx, const char *opt, const char *arg); +/** + * Override the cpucount. + */ +int opt_cpucount(void *optctx, const char *opt, const char *arg); + /** * Fallback for options that are not explicitly handled, these will be * parsed through AVOptions. @@ -239,6 +245,7 @@ void show_help_options(const OptionDef *options, const char *msg, int req_flags, { "report", 0, { .func_arg = opt_report }, "generate a report" }, \ { "max_alloc", HAS_ARG, { .func_arg = opt_max_alloc }, "set maximum size of a single allocated block", "bytes" }, \ { "cpuflags", HAS_ARG | OPT_EXPERT, { .func_arg = opt_cpuflags }, "force specific cpu flags", "flags" }, \ + { "cpucount", HAS_ARG | OPT_EXPERT, { .func_arg = opt_cpucount }, "force specific cpu count", "count" }, \ { "hide_banner", OPT_BOOL | OPT_EXPERT, {&hide_banner}, "do not show program banner", "hide_banner" }, \ CMDUTILS_COMMON_OPTIONS_AVDEVICE \ diff --git a/libavutil/cpu.c b/libavutil/cpu.c index 52f6b9a3bf..ccd5b5adac 100644 --- a/libavutil/cpu.c +++ b/libavutil/cpu.c @@ -48,6 +48,7 @@ #endif static atomic_int cpu_flags = ATOMIC_VAR_INIT(-1); +static atomic_int cpu_count = ATOMIC_VAR_INIT(-1); static int get_cpu_flags(void) { @@ -306,14 +307,27 @@ int av_cpu_count(void) nb_cpus = sysinfo.dwNumberOfProcessors; #endif + int count = atomic_load_explicit(&cpu_count, memory_order_relaxed); + if (!printed) { av_log(NULL, AV_LOG_DEBUG, "detected %d logical cores\n", nb_cpus); + if (count > 0) { + av_log(NULL, AV_LOG_DEBUG, "overriding to %d logical cores\n", count); + } printed = 1; } + if (count > 0) { + nb_cpus = count; + } + return nb_cpus; } +void av_force_cpu_count(int count){ + atomic_store_explicit(&cpu_count, count, memory_order_relaxed); +} + size_t av_cpu_max_align(void) { if (ARCH_MIPS) diff --git a/libavutil/cpu.h b/libavutil/cpu.h index 83099dd969..9c682ad50b 100644 --- a/libavutil/cpu.h +++ b/libavutil/cpu.h @@ -119,6 +119,12 @@ int av_parse_cpu_caps(unsigned *flags, const char *s); */ int av_cpu_count(void); +/** + * Overrides cpu count detection and forces the specified count. + * Count < 1 disables forcing of specific count. + */ +void av_force_cpu_count(int count); + /** * Get the maximum data alignment that may be required by FFmpeg. *