From patchwork Tue Sep 24 14:16:57 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nuo Mi X-Patchwork-Id: 51897 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:d8ca:0:b0:48e:c0f8:d0de with SMTP id dy10csp887465vqb; Sat, 28 Sep 2024 02:26:12 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCV7l997u+sF5GCayjPd0DmPVquFM/yUvxduY8CnGkroLcfye/zw60IyYzxdJpTY/PNrur9CbeY5qVMbhdhDICbe@gmail.com X-Google-Smtp-Source: AGHT+IHAjDa32aFocbQXGVO7onnNH0+q3q2WcfCvBGHq5wh48CPteMyJm9ij5PDOg8OPHluw9+9J X-Received: by 2002:a05:6402:358e:b0:5c8:8e0e:8aa2 with SMTP id 4fb4d7f45d1cf-5c88e0e8b54mr80561a12.22.1727515571928; Sat, 28 Sep 2024 02:26:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1727515571; cv=none; d=google.com; s=arc-20240605; b=ctRZBt6fAAuaD+xNk1v41w+EbekBL1VbgpKDU3pIU/gVBTOSzvaueo5czwRS/W68eh nMDHrUco9nQ80cLmrCebL7Kh01zpaKf6Cg8rjqXPwZsQhf1DK3fqJa7FxNeSeQW/fpKY mbM18cjRxJYqVlxjvCrFYWZ5OXPu2yK6+UYLO9ppAN5OMAW6S5m5qZSH/HQdEB2EOccF a5KCccju7hfST7vmFi6r1KpCe9obhiib+VPvSuV02gyFOjSvV0KG6mZjQrGPR3y/GKuK l5WkGaS5QWJwY1zBToFp7D6qni5xs9LQaiZbdza0tD05vQF8wu6EC492zoGtbWvGsgm8 ezPw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:message-id:date:to:from :dkim-signature:delivered-to; bh=1YVsMplT8aypJRcO8CezmgADQwUAwQmwAjtRmMhRK6o=; fh=mZk9AfRmPBMGW9h158yccPeJgZmEjzU2tMQtLZcF184=; b=SMsgl0IEZbgEZFXsvYjhJh7jgF7Zzd7PDl38MQjC/YLC5CABsq34uJT+7nbJMVy8yh YSQ3oHpsmU0dtcQKUc0A5RHhw5imotweNIM1vYRZMyj6clgIZjCrVdN2ten4eKD05scG L8X236nl8X5uG2q/2APs7WnzycU2MC32xfDj1qVhC3jTGUolRwz7CkuXzMt4oFt/5wSz 4qeIkDkYa3KJP9hyz8g+NJqbOiLjDmrW/j0YB5fmYCHOIPWj0LaocKYrmtiBFT5nftgy K+qdwzE7ONpzNTIhAYOufontQsDwhSVCk3p7BBUSlGkXUccPTztuTrwfNB11zqxuSXVN 6cBA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=jBA9Jfov; 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=QUARANTINE dis=NONE) header.from=gmail.com; dara=fail header.i=@gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 4fb4d7f45d1cf-5c88249cba5si2954347a12.436.2024.09.28.02.26.11; Sat, 28 Sep 2024 02:26:11 -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=@gmail.com header.s=20230601 header.b=jBA9Jfov; 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=QUARANTINE dis=NONE) header.from=gmail.com; dara=fail header.i=@gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D5DA068DB5E; Tue, 24 Sep 2024 17:17:10 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pl1-f172.google.com (mail-pl1-f172.google.com [209.85.214.172]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5AF4768A604 for ; Tue, 24 Sep 2024 17:17:04 +0300 (EEST) Received: by mail-pl1-f172.google.com with SMTP id d9443c01a7336-2054e22ce3fso56141855ad.2 for ; Tue, 24 Sep 2024 07:17:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1727187422; x=1727792222; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=49rdA3AAMUZ1QmRSoOWQzLK2EVmuqA00sgjUoYUWgmU=; b=jBA9JfovPLIr39kBcunjIONP3R18BjqUN6sb5mA6HdIPq5vdk6veTkwlz/auRDxpm/ Ff8gaHwFOtCygRbWfaOnlgROLzcIqNjFvX5/HpJWvPxzkLj4KZBElmE8KcUrf9heMeoU Kf/3wMLWE/AHymhjSZ9kopRjXTllA2B3y2MsgfDmw3Rp7I3mH7p1IzjZZ48MST2VIbH7 XoeKolXaQBgoQrZaQiDpv3V65v//sqJqTGDvZoPJYMStZFxOX0vDsA/pyxhDSGatX+9n Aan7ll+I3aXWO9pYtONH9AqAq48I+QfUDIdKjJRUHB9JEAl4pXf7rkc+HYZ9ElgJecVK WPGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1727187422; x=1727792222; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=49rdA3AAMUZ1QmRSoOWQzLK2EVmuqA00sgjUoYUWgmU=; b=OIEBApKKglEgC9d+aPbVEtG2a0Df8ZWz4EjNwC7NW8GtQ8BfGwdgI6C9YZQ3pMipV5 lv/BQnveWifGnSRYNijeOrddgevkSFkwnM22GA0e6/IhNkJLkRw2g1z3QSBhIt7qQG+O RaDlSvpDRmJHzIrydnSV8qLq/sOdQxfz+U83/7alZ9O/wrZ/UZC4VdO1V5A6W/iB6Lvf PuMfLMv26p1Eg7l3CHzfN76uMDeSMXGtXmzkOWxDZjwyJoM+5NcmzLcvSTLH7MpirgSF KzhO03WROXnOSwZun5xgngYSNhOmtCuIkmFxQcEBpz9v0u8H1jegEIiJaRwXaph4dyn2 03Sw== X-Gm-Message-State: AOJu0YyktJE5pnb5ypkp7j/nLPkj2qPpghXml2iDmbJ0MUSJZMs+nSpE hoHoPU2zrBtf2POj0q0QnZhKVvm/LmQ1If5kR5Bsa1xvPQATo0xy+2bqKffsZ18= X-Received: by 2002:a17:902:ccd1:b0:208:d893:5707 with SMTP id d9443c01a7336-208d8935c47mr197945335ad.1.1727187422144; Tue, 24 Sep 2024 07:17:02 -0700 (PDT) Received: from localhost ([112.64.8.17]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-20af16e5478sm10911715ad.1.2024.09.24.07.17.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Sep 2024 07:17:01 -0700 (PDT) From: Nuo Mi To: ffmpeg-devel@ffmpeg.org Date: Tue, 24 Sep 2024 22:16:57 +0800 Message-Id: <20240924141658.39574-1-nuomi2021@gmail.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/2] avutils/executor: remove unused ready callback 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 Cc: Nuo Mi Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: wPBijGBBJQ65 Due to the nature of multithreading, using a "ready check" mechanism may introduce a deadlock. For example: Suppose all tasks have been submitted to the executor, and the last thread checks the entire list and finds no ready tasks. It then goes to sleep, waiting for a new task. However, for some multithreading-related reason, a task becomes ready after the check. Since no other thread is aware of this and no new tasks are being added to the executor, a deadlock occurs. In VVC, this function is unnecessary because we use a scoreboard. All tasks submitted to the executor are ready tasks. --- libavcodec/vvc/thread.c | 8 -------- libavutil/executor.c | 6 ++---- libavutil/executor.h | 3 --- 3 files changed, 2 insertions(+), 15 deletions(-) diff --git a/libavcodec/vvc/thread.c b/libavcodec/vvc/thread.c index 86a7753c6a..6208cc1811 100644 --- a/libavcodec/vvc/thread.c +++ b/libavcodec/vvc/thread.c @@ -372,13 +372,6 @@ static int task_is_stage_ready(VVCTask *t, int add) return task_has_target_score(t, stage, score); } -static int task_ready(const AVTask *_t, void *user_data) -{ - VVCTask *t = (VVCTask*)_t; - - return task_is_stage_ready(t, 0); -} - #define CHECK(a, b) \ do { \ if ((a) != (b)) \ @@ -689,7 +682,6 @@ AVExecutor* ff_vvc_executor_alloc(VVCContext *s, const int thread_count) s, sizeof(VVCLocalContext), task_priority_higher, - task_ready, task_run, }; return av_executor_alloc(&callbacks, thread_count); diff --git a/libavutil/executor.c b/libavutil/executor.c index bfce2ac444..64e6cc0775 100644 --- a/libavutil/executor.c +++ b/libavutil/executor.c @@ -79,10 +79,8 @@ static void add_task(AVTask **prev, AVTask *t) static int run_one_task(AVExecutor *e, void *lc) { AVTaskCallbacks *cb = &e->cb; - AVTask **prev; + AVTask **prev = &e->tasks; - for (prev = &e->tasks; *prev && !cb->ready(*prev, cb->user_data); prev = &(*prev)->next) - /* nothing */; if (*prev) { AVTask *t = remove_task(prev, *prev); if (e->thread_count > 0) @@ -143,7 +141,7 @@ AVExecutor* av_executor_alloc(const AVTaskCallbacks *cb, int thread_count) { AVExecutor *e; int has_lock = 0, has_cond = 0; - if (!cb || !cb->user_data || !cb->ready || !cb->run || !cb->priority_higher) + if (!cb || !cb->user_data || !cb->run || !cb->priority_higher) return NULL; e = av_mallocz(sizeof(*e)); diff --git a/libavutil/executor.h b/libavutil/executor.h index 0eb21c10c8..7af53c92ce 100644 --- a/libavutil/executor.h +++ b/libavutil/executor.h @@ -36,9 +36,6 @@ typedef struct AVTaskCallbacks { // return 1 if a's priority > b's priority int (*priority_higher)(const AVTask *a, const AVTask *b); - // task is ready for run - int (*ready)(const AVTask *t, void *user_data); - // run the task int (*run)(AVTask *t, void *local_context, void *user_data); } AVTaskCallbacks; From patchwork Tue Sep 24 14:16:58 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Nuo Mi X-Patchwork-Id: 51816 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:9548:0:b0:48e:c0f8:d0de with SMTP id t8csp260900vqk; Tue, 24 Sep 2024 23:44:22 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCXSIq8aIn74Zn/qmUBJouBCvc7lZDaLg8BJpUH0ps7lSpqkgRO4R1oLw6VmEmyjrk15YUhaq8OFx3GGpGbMjxbW@gmail.com X-Google-Smtp-Source: AGHT+IGW5KKgDrOB3fXuEjRB1mAwzx5VDjuZZ8B+6aOp908GRvGA7mD7q5/oNJvZJrjUuo8bOYJR X-Received: by 2002:a05:6402:210f:b0:5c5:ba22:dc8d with SMTP id 4fb4d7f45d1cf-5c7207582b8mr1363204a12.31.1727246662056; Tue, 24 Sep 2024 23:44:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1727246662; cv=none; d=google.com; s=arc-20240605; b=NluH9Nxhh9h8sVU0uJCs+fC6RzXbUxhatrbGjxhNr+S2sxjgP4dRlvRAmDcHel4lZ5 MFiYVfducDPxyKwxUrgCfvFMrXAioHla12is8kZd1kIlEXNj5/zrGQvGNvPTxEJCoZZU erL9xl5gL6xitRtBD1IZxK2AB+DyA9FVrQbU6eM282oZoAxQK7AUFrB0FT7wP1PlSmDy 5vrQqtJZyNsLY7My2r6kpWkHhZdL/UxVPrVf/+JdIvz85JA5LP4QWOOrt8oEooNr6UWo ZXf7bVRY9dLwPVidIfZ7msElPD9HWEE3ExmuwA92datRbDUm5l94wxj9LKM5Cgl/MyFw rOLQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=fFXd9dIt1u0jZM2ZUtl1bz09tkqfX7t/z+B1uR2yoYU=; fh=mZk9AfRmPBMGW9h158yccPeJgZmEjzU2tMQtLZcF184=; b=aeiulQwU3ygufNUgfJVaYAFIOA1SDEencZfmFLjZhUCC2N6MpnSdX8HLH1X7DxsABq yudd0xzBlf4gzAi2uf6n0xEA85wbEOtppJvivOfdnSgbMseeJ4hitJLM3mRvmcepBURr UuW9LXz/1NBb2+tYkUVeW3fLaPsBxUFma5OIt0CMLUAXzITVI6ZhTCwb9Cd1cU2M1rvA aeIXtOFCX13bGM1WZry04XhsX25pcIFFgxjfMx3uJyscO6q4WeTig4Xa7RnXTBVsqqQW Kvx7LBqL0FlZR1QZDq8lJ0gD0dG/t6iv2mzoFoC8hPe0RXUpa9vFIVlibs3k7YEndeqM Z0ow==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=mQjfULE8; 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=QUARANTINE dis=NONE) header.from=gmail.com; dara=fail header.i=@gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 4fb4d7f45d1cf-5c5cf4dd7d1si2034697a12.556.2024.09.24.23.44.21; Tue, 24 Sep 2024 23:44:22 -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=@gmail.com header.s=20230601 header.b=mQjfULE8; 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=QUARANTINE dis=NONE) header.from=gmail.com; dara=fail header.i=@gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id EE8EC68DB8A; Tue, 24 Sep 2024 17:17:15 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pl1-f178.google.com (mail-pl1-f178.google.com [209.85.214.178]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7712C68DB6A for ; Tue, 24 Sep 2024 17:17:09 +0300 (EEST) Received: by mail-pl1-f178.google.com with SMTP id d9443c01a7336-206aee40676so45434515ad.0 for ; Tue, 24 Sep 2024 07:17:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1727187427; x=1727792227; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=lNjFFKRNEZ6u0nv1nJkozfd+COM/CPHGMfkxpwN1IoU=; b=mQjfULE88fbLqQUMBuTwWQfti5c9Syh2HIiydv8IT+xWtbiMOJnczYlQL0YSpkmhSN gFenKXA019pY4ho2ASNu8rcFIpWR3lbpHOOjpX7dn3JcHxqoNEyRKUwSgLnRzjKRng0k ky9nB1Kxz62N7S8HyD2G7ORUb+E2BmoLr6c1h2rvAAZV+68HOYp3ZwHgFw2hx76IkWbw X4j4B2YXBXIVLND2b7NkAma8la5pHnT5yHKDFqkjug5ealVdHMROwGv00Iq9qIat2DLn OKrxg8vtMQtHzSKMxK0p34u7Po+/kFNjWFp0yTIea4rWvm0vlmTWZ7Bev+1f34eQ6TSH PYtQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1727187427; x=1727792227; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=lNjFFKRNEZ6u0nv1nJkozfd+COM/CPHGMfkxpwN1IoU=; b=wdgWrUdHh04uFzL1wyhxUdX4mM5eLwEhet4YjvGQPLl5XRXy+gicoQnscdHNRPCe9i E13DK0Rh3j6kCvT+D2K1NoHdDwpsZYDIkL6UEY3+YeohmMMYZeDOc3+msm1C/ZVktBgH F79WGgD1xoogJenmKcMenmac7MQ+kYf5YwJhAx3Cosg7qxmel3ViZc5iYo3ke4yeCB/Z F9eQOVTKTHjmpl7dgrTU7TcaPEbiu3ZnPbwp5K0Q6JXu9h0F6Tmw3Jb/JzfvHK3Z7NnR lFJgFUTefYzgg8LGRkI3sZ7v6kcGXc2y/ZMH/Ki8zkZGphQm0LECwOln7SHuj230OaQl cAWQ== X-Gm-Message-State: AOJu0YzAxfIWa336sxu4CkFFfyM1xy8w+0daL3OGObv52irCLn7gqYeO nNtBfmv16YUXl4JUXE4kGevrjbVANdZCpF7v6gORe1rPi+Y1Q097TejC/BRLBHw= X-Received: by 2002:a17:903:192:b0:207:1825:c65e with SMTP id d9443c01a7336-208d838654amr246692815ad.18.1727187427384; Tue, 24 Sep 2024 07:17:07 -0700 (PDT) Received: from localhost ([112.64.8.17]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2dd6eec8914sm11385799a91.31.2024.09.24.07.17.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Sep 2024 07:17:07 -0700 (PDT) From: Nuo Mi To: ffmpeg-devel@ffmpeg.org Date: Tue, 24 Sep 2024 22:16:58 +0800 Message-Id: <20240924141658.39574-2-nuomi2021@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240924141658.39574-1-nuomi2021@gmail.com> References: <20240924141658.39574-1-nuomi2021@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/2] avcodec/vvc: simplify priority logical to improve performance for 4K/8K 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 Cc: Nuo Mi Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: hH5os8CevKur For 4K/8K video processing, it's possible to have over 1,000 tasks pending on the executor. In such cases, O(n) and O(log(n)) insertion times are too costly. Reducing this to O(1) will significantly decrease the time spent in critical sections clip | before | after | delta ------------------------------------------------------------|--------|--------|------- VVC_HDR_UHDTV2_OpenGOP_7680x4320_50fps_HLG10.bit | 24 | 27 | 12.5% VVC_HDR_UHDTV2_OpenGOP_7680x4320_50fps_HLG10_HighBitrate.bit| 12 | 17 | 41.7% tears_of_steel_4k_8M_8bit_2000.vvc | 34 | 102 | 200.0% VVC_UHDTV1_OpenGOP_3840x2160_60fps_HLG10.bit | 126 | 128 | 1.6% RitualDance_1920x1080_60_10_420_37_RA.266 | 350 | 378 | 8.0% NovosobornayaSquare_1920x1080.bin | 341 | 369 | 8.2% Tango2_3840x2160_60_10_420_27_LD.266 | 69 | 70 | 1.4% RitualDance_1920x1080_60_10_420_32_LD.266 | 243 | 259 | 6.6% Chimera_8bit_1080P_1000_frames.vvc | 420 | 392 | -6.7% BQTerrace_1920x1080_60_10_420_22_RA.vvc | 148 | 144 | -2.7% --- libavcodec/vvc/thread.c | 48 +++++++++++++++--------------------- libavutil/executor.c | 54 ++++++++++++++++++++++++++--------------- libavutil/executor.h | 5 ++-- 3 files changed, 57 insertions(+), 50 deletions(-) diff --git a/libavcodec/vvc/thread.c b/libavcodec/vvc/thread.c index 6208cc1811..0a1a954d18 100644 --- a/libavcodec/vvc/thread.c +++ b/libavcodec/vvc/thread.c @@ -103,13 +103,28 @@ typedef struct VVCFrameThread { AVCond cond; } VVCFrameThread; +#define PRIORITY_LOWEST 2 static void add_task(VVCContext *s, VVCTask *t) { - VVCFrameThread *ft = t->fc->ft; + VVCFrameThread *ft = t->fc->ft; + AVTask *task = &t->u.task; + const int priorities[] = { + 0, // VVC_TASK_STAGE_INIT, + 0, // VVC_TASK_STAGE_PARSE, + // For an 8K clip, a CTU line completed in the reference frame may trigger 64 and more inter tasks. + // We assign these tasks the lowest priority to avoid being overwhelmed with inter tasks. + PRIORITY_LOWEST, // VVC_TASK_STAGE_INTER + 1, // VVC_TASK_STAGE_RECON, + 1, // VVC_TASK_STAGE_LMCS, + 1, // VVC_TASK_STAGE_DEBLOCK_V, + 1, // VVC_TASK_STAGE_DEBLOCK_H, + 1, // VVC_TASK_STAGE_SAO, + 1, // VVC_TASK_STAGE_ALF, + }; atomic_fetch_add(&ft->nb_scheduled_tasks, 1); - - av_executor_execute(s->executor, &t->u.task); + task->priority = priorities[t->stage]; + av_executor_execute(s->executor, task); } static void task_init(VVCTask *t, VVCTaskStage stage, VVCFrameContext *fc, const int rx, const int ry) @@ -372,31 +387,6 @@ static int task_is_stage_ready(VVCTask *t, int add) return task_has_target_score(t, stage, score); } -#define CHECK(a, b) \ - do { \ - if ((a) != (b)) \ - return (a) < (b); \ - } while (0) - -static int task_priority_higher(const AVTask *_a, const AVTask *_b) -{ - const VVCTask *a = (const VVCTask*)_a; - const VVCTask *b = (const VVCTask*)_b; - - - if (a->stage <= VVC_TASK_STAGE_PARSE || b->stage <= VVC_TASK_STAGE_PARSE) { - CHECK(a->stage, b->stage); - CHECK(a->fc->decode_order, b->fc->decode_order); //decode order - CHECK(a->ry, b->ry); - return a->rx < b->rx; - } - - CHECK(a->fc->decode_order, b->fc->decode_order); //decode order - CHECK(a->rx + a->ry + a->stage, b->rx + b->ry + b->stage); //zigzag with type - CHECK(a->rx + a->ry, b->rx + b->ry); //zigzag - return a->ry < b->ry; -} - static void check_colocation(VVCContext *s, VVCTask *t) { const VVCFrameContext *fc = t->fc; @@ -681,7 +671,7 @@ AVExecutor* ff_vvc_executor_alloc(VVCContext *s, const int thread_count) AVTaskCallbacks callbacks = { s, sizeof(VVCLocalContext), - task_priority_higher, + PRIORITY_LOWEST + 1, task_run, }; return av_executor_alloc(&callbacks, thread_count); diff --git a/libavutil/executor.c b/libavutil/executor.c index 64e6cc0775..5c3bf993dc 100644 --- a/libavutil/executor.c +++ b/libavutil/executor.c @@ -48,6 +48,11 @@ typedef struct ThreadInfo { ExecutorThread thread; } ThreadInfo; +typedef struct Queue { + AVTask *head; + AVTask *tail; +} Queue; + struct AVExecutor { AVTaskCallbacks cb; int thread_count; @@ -60,29 +65,41 @@ struct AVExecutor { AVCond cond; int die; - AVTask *tasks; + Queue *q; }; -static AVTask* remove_task(AVTask **prev, AVTask *t) +static AVTask* remove_task(Queue *q) { - *prev = t->next; - t->next = NULL; + AVTask *t = q->head; + if (t) { + q->head = t->next; + t->next = NULL; + if (!q->head) + q->tail = NULL; + } return t; } -static void add_task(AVTask **prev, AVTask *t) +static void add_task(Queue *q, AVTask *t) { - t->next = *prev; - *prev = t; + t->next = NULL; + if (!q->head) { + q->tail = q->head = t; + } else { + q->tail->next = t; + q->tail = t; + } } static int run_one_task(AVExecutor *e, void *lc) { AVTaskCallbacks *cb = &e->cb; - AVTask **prev = &e->tasks; + AVTask *t = NULL; - if (*prev) { - AVTask *t = remove_task(prev, *prev); + for (int i = 0; i < e->cb.priorities && !t; i++) + t = remove_task(e->q + i); + + if (t) { if (e->thread_count > 0) ff_mutex_unlock(&e->lock); cb->run(t, lc, cb->user_data); @@ -132,6 +149,7 @@ static void executor_free(AVExecutor *e, const int has_lock, const int has_cond) ff_mutex_destroy(&e->lock); av_free(e->threads); + av_free(e->q); av_free(e->local_contexts); av_free(e); @@ -141,7 +159,7 @@ AVExecutor* av_executor_alloc(const AVTaskCallbacks *cb, int thread_count) { AVExecutor *e; int has_lock = 0, has_cond = 0; - if (!cb || !cb->user_data || !cb->run || !cb->priority_higher) + if (!cb || !cb->user_data || !cb->run || !cb->priorities) return NULL; e = av_mallocz(sizeof(*e)); @@ -153,6 +171,10 @@ AVExecutor* av_executor_alloc(const AVTaskCallbacks *cb, int thread_count) if (!e->local_contexts) goto free_executor; + e->q = av_calloc(e->cb.priorities, sizeof(Queue)); + if (!e->q) + goto free_executor; + e->threads = av_calloc(FFMAX(thread_count, 1), sizeof(*e->threads)); if (!e->threads) goto free_executor; @@ -192,16 +214,10 @@ void av_executor_free(AVExecutor **executor) void av_executor_execute(AVExecutor *e, AVTask *t) { - AVTaskCallbacks *cb = &e->cb; - AVTask **prev; - if (e->thread_count) ff_mutex_lock(&e->lock); - if (t) { - for (prev = &e->tasks; *prev && cb->priority_higher(*prev, t); prev = &(*prev)->next) - /* nothing */; - add_task(prev, t); - } + if (t) + add_task(e->q + t->priority % e->cb.priorities, t); if (e->thread_count) { ff_cond_signal(&e->cond); ff_mutex_unlock(&e->lock); diff --git a/libavutil/executor.h b/libavutil/executor.h index 7af53c92ce..c6f475b8f2 100644 --- a/libavutil/executor.h +++ b/libavutil/executor.h @@ -25,6 +25,7 @@ typedef struct AVExecutor AVExecutor; typedef struct AVTask AVTask; struct AVTask { + int priority; // task priority should >= 0 and < AVTaskCallbacks.priorities AVTask *next; }; @@ -33,8 +34,8 @@ typedef struct AVTaskCallbacks { int local_context_size; - // return 1 if a's priority > b's priority - int (*priority_higher)(const AVTask *a, const AVTask *b); + // How many priorities do we have? + int priorities; // run the task int (*run)(AVTask *t, void *local_context, void *user_data);