From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 60190A0542; Mon, 6 Jun 2022 11:35:05 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id F124F40A7F; Mon, 6 Jun 2022 11:35:04 +0200 (CEST) Received: from forward501p.mail.yandex.net (forward501p.mail.yandex.net [77.88.28.111]) by mails.dpdk.org (Postfix) with ESMTP id 2636240150; Mon, 6 Jun 2022 11:35:04 +0200 (CEST) Received: from sas1-5f1844c300c3.qloud-c.yandex.net (sas1-5f1844c300c3.qloud-c.yandex.net [IPv6:2a02:6b8:c14:5781:0:640:5f18:44c3]) by forward501p.mail.yandex.net (Yandex) with ESMTP id 8D5506212758; Mon, 6 Jun 2022 12:35:03 +0300 (MSK) Received: from sas1-0701b3ebb6ca.qloud-c.yandex.net (sas1-0701b3ebb6ca.qloud-c.yandex.net [2a02:6b8:c08:21a5:0:640:701:b3eb]) by sas1-5f1844c300c3.qloud-c.yandex.net (mxback/Yandex) with ESMTP id R3rAmID28N-Z3faCmd9; Mon, 06 Jun 2022 12:35:03 +0300 X-Yandex-Fwd: 2 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex.ru; s=mail; t=1654508103; bh=yyZkUjjUW9CURdHj7NbC+e3pOf8bgV2tIv4w4CjFALY=; h=In-Reply-To:From:Subject:Cc:References:Date:Message-ID:To; b=Sx59gFBsZrU0VfQt7x1pMiPoRFGhwBfvaoJNIU91Y9EjJaje+odx+sxfyTeEEf82H mUeDg33yel1cktTYtrWVZv+XxqAbV7Y/eeD9QqAa4bd6AIml+/cEgNCylD0W4MrG9B vUyFLbMyt6fxfJkuIupUPg06oW3a1bzxue+7gxE4= Authentication-Results: sas1-5f1844c300c3.qloud-c.yandex.net; dkim=pass header.i=@yandex.ru Received: by sas1-0701b3ebb6ca.qloud-c.yandex.net (smtp/Yandex) with ESMTPSA id N03bydqLWf-Z2JWFuOM; Mon, 06 Jun 2022 12:35:02 +0300 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (Client certificate not present) Message-ID: <497ed526-2fb7-805a-f72c-5909b85a62c1@yandex.ru> Date: Mon, 6 Jun 2022 10:35:00 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.9.1 Subject: Re: Optimizations are not features Content-Language: en-US To: Andrew Rybchenko , =?UTF-8?Q?Morten_Br=c3=b8rup?= , Jerin Jacob Cc: dpdk-dev , techboard@dpdk.org References: <98CBD80474FA8B44BF855DF32C47DC35D870EB@smartserver.smartshare.dk> <98CBD80474FA8B44BF855DF32C47DC35D870EF@smartserver.smartshare.dk> From: Konstantin Ananyev In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org 04/06/2022 13:51, Andrew Rybchenko пишет: > On 6/4/22 15:19, Morten Brørup wrote: >>> From: Jerin Jacob [mailto:jerinjacobk@gmail.com] >>> Sent: Saturday, 4 June 2022 13.10 >>> >>> On Sat, Jun 4, 2022 at 3:30 PM Andrew Rybchenko >>> wrote: >>>> >>>> On 6/4/22 12:33, Jerin Jacob wrote: >>>>> On Sat, Jun 4, 2022 at 2:39 PM Morten Brørup >>> wrote: >>>>>> >>>>>> I would like the DPDK community to change its view on compile time >>> options. Here is why: >>>>>> >>>>>> >>>>>> >>>>>> Application specific performance micro-optimizations like “fast >>> mbuf free” and “mbuf direct re-arm” are being added to DPDK and >>> presented as features. >>>>>> >>>>>> >>>>>> >>>>>> They are not features, but optimizations, and I don’t understand >>> the need for them to be available at run-time! >>>>>> >>>>>> >>>>>> >>>>>> Instead of adding a bunch of exotic exceptions to the fast path of >>> the PMDs, they should be compile time options. This will improve >>> performance by avoiding branches in the fast path, both for the >>> applications using them, and for generic applications (where the exotic >>> code is omitted). >>>>> >>>>> Agree. I think, keeping the best of both worlds would be >>>>> >>>>> -Enable the feature/optimization as runtime >>>>> -Have a compile-time option to disable the feature/optimization as >>> an override. >>>> >>>> It is hard to find the right balance, but in general compile >>>> time options are a nightmare for maintenance. Number of >>>> required builds will grow as an exponent. >> >> Test combinations are exponential for N features, regardless if N are >> runtime or compile time options. > > But since I'm talking about build checks I don't care about exponential > grows in run time. Yes, testing should care, but it is a separate story. > >> >>>> Of course, we can >>>> limit number of checked combinations, but it will result in >>>> flow of patches to fix build in other cases. >>> >>> The build breakage can be fixed if we use (2) vs (1) >>> >>> 1) >>> #ifdef ... >>> My feature >>> #endif >>> >>> 2) >>> static __rte_always_inline int >>> rte_has_xyz_feature(void) >>> { >>> #ifdef RTE_LIBRTE_XYZ_FEATURE >>>          return RTE_LIBRTE_XYZ_FEATURE; >>> #else >>>          return 0; >>> #endif >>> } >>> >>> if(rte_has_xyz_feature())) { >>> My feature code >>> >>> } >>> > > Jerin, thanks, very good example. > >> I'm not sure all the features can be covered by that, e.g. added >> fields in structures. > > +1 > >> >> Also, I would consider such features "opt in" at compile time only. As >> such, they could be allowed to break the ABI/API. >> >>> >>> >>>> Also compile time options tend to make code less readable >>>> which makes all aspects of the development harder. >>>> >>>> Yes, compile time is nice for micro optimizations, but >>>> I have great concerns that it is a right way to go. >>>> >>>>>> Please note that I am only talking about the performance >>> optimizations that are limited to application specific use cases. I >>> think it makes sense to require that performance optimizing an >>> application also requires recompiling the performance critical >>> libraries used by it. >>>>>>abandon some of existing functionality to create a 'short-cut' >>>>>> >>>>>> >>>>>> Allowing compile time options for application specific performance >>> optimizations in DPDK would also open a path for other optimizations, >>> which can only be achieved at compile time, such as “no fragmented >>> packets”, “no attached mbufs” and “single mbuf pool”. And even more >>> exotic optimizations, such as the “indexed mempool cache”, which was >>> rejected due to ABI violations – they could be marked as “risky and >>> untested” or similar, but still be part of the DPDK main repository. >>>>>> Thanks Morten for bringing it up, it is an interesting topic. Though I look at it from different angle. All optimizations you mentioned above introduce new limitations: MBUF_FAST_FREE - no indirect mbufs and multiple mempools, mempool object indexes - mempool size is limited to 4GB, direct rearm - drop ability to stop/reconfigure TX queue, while RX queue is still running, etc. Note that all these limitations are not forced by HW. All of them are pure SW limitations that developers forced in (or tried to) to get few extra performance. That's concerning tendency. As more and more such 'optimization via limitation' will come in: - DPDK feature list will become more and more fragmented. - Would cause more and more confusion for the users. - Unmet expectations - difference in performance between 'default' and 'optimized' version of DPDK will become bigger and bigger. - As Andrew already mentioned, maintaining all these 'sub-flavours' of DPDK will become more and more difficult. So, probably instead of making such changes easier, we need somehow to persuade developers to think more about optimizations that would be generic and transparent to the user. I do realize that it is not always possible due to various reasons (HW limitations, external dependencies, etc.) but that's another story. Let's take for example MBUF_FAST_FREE. In fact, I am not sure that we need it as tx offload flag at all. PMD TX-path has all necessary information to decide at run-time can it do fast_free() for not: At tx_burst() PMD can check are all mbufs satisfy these conditions (same mempool, refcnt==1) and update some fields and/or counters inside TXQ to reflect it. Then, at tx_free() we can use this info to decide between fast_free() and normal_free(). As at tx_burst() we read mbuf fields anyway, impact for this extra step I guess would be minimal. Yes, most likely, it wouldn't be as fast as with current TX offload flag, or conditional compilation approach. But it might be still significantly faster then normal_free(), plus such approach will be generic and transparent to the user. Konstantin