From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 9D35FA0566; Tue, 10 Mar 2020 15:44:48 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id B3C9F1BF7F; Tue, 10 Mar 2020 15:44:47 +0100 (CET) Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by dpdk.org (Postfix) with ESMTP id E3C8523D for ; Tue, 10 Mar 2020 15:44:45 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga107.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 10 Mar 2020 07:44:44 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.70,518,1574150400"; d="scan'208,217";a="321824353" Received: from vmedvedk-mobl.ger.corp.intel.com (HELO [10.237.220.123]) ([10.237.220.123]) by orsmga001.jf.intel.com with ESMTP; 10 Mar 2020 07:44:42 -0700 To: Jerin Jacob Cc: dpdk-dev , "Ananyev, Konstantin" , "Richardson, Bruce" , Gavin Hu References: <1583757826-375246-1-git-send-email-vladimir.medvedkin@intel.com> <1583757826-375246-2-git-send-email-vladimir.medvedkin@intel.com> From: "Medvedkin, Vladimir" Message-ID: <9e4b3980-e1b5-2bfd-d551-bfa8ad022e50@intel.com> Date: Tue, 10 Mar 2020 14:44:41 +0000 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.5.0 MIME-Version: 1.0 In-Reply-To: Content-Language: en-US Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-Content-Filtered-By: Mailman/MimeDel 2.1.15 Subject: Re: [dpdk-dev] [PATCH 1/6] eal: introduce zmm type for AVX 512-bit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Hi Jerin, On 09/03/2020 16:39, Jerin Jacob wrote: > On Mon, Mar 9, 2020 at 6:14 PM Vladimir Medvedkin > wrote: >> New data type to manipulate 512 bit AVX values. >> >> Signed-off-by: Vladimir Medvedkin >> --- >> lib/librte_eal/common/include/arch/x86/rte_vect.h | 20 ++++++++++++++++++++ >> 1 file changed, 20 insertions(+) >> >> diff --git a/lib/librte_eal/common/include/arch/x86/rte_vect.h b/lib/librte_eal/common/include/arch/x86/rte_vect.h >> index df5a607..09f30e6 100644 >> --- a/lib/librte_eal/common/include/arch/x86/rte_vect.h >> +++ b/lib/librte_eal/common/include/arch/x86/rte_vect.h >> @@ -90,6 +90,26 @@ __extension__ ({ \ >> }) >> #endif /* (defined(__ICC) && __ICC < 1210) */ >> >> +#ifdef __AVX512F__ >> + >> +typedef __m512i zmm_t; >> + >> +#define ZMM_SIZE (sizeof(zmm_t)) >> +#define ZMM_MASK (ZMM_SIZE - 1) >> + >> +typedef union rte_zmm { >> + zmm_t z; >> + ymm_t y[ZMM_SIZE / sizeof(ymm_t)]; >> + xmm_t x[ZMM_SIZE / sizeof(xmm_t)]; >> + uint8_t u8[ZMM_SIZE / sizeof(uint8_t)]; >> + uint16_t u16[ZMM_SIZE / sizeof(uint16_t)]; >> + uint32_t u32[ZMM_SIZE / sizeof(uint32_t)]; >> + uint64_t u64[ZMM_SIZE / sizeof(uint64_t)]; >> + double pd[ZMM_SIZE / sizeof(double)]; > Are we missing __attribute__((aligned(64))) here? Agree. While modern compilers align __m512i by default, some old could failure to align. Please correct me if I'm wrong. > >> +} rte_zmm_t; > IMO, Due to legacy reason, we have selected rte_xmm_t, rte_ymm_t for > 128 and 256 operations in public APIs[1] As for me, since these functions are inlined, prototype should be changed to uint32_t ip[4] instead of passing vector type as an argument. > # Not sure where xmm_t and ymm_t and new zmm_t come from? Is this name > x86 arch-specific? Yes, that's why they are in arch/x86/rte_vect.h > If so, > why not give the more generic name rte_512i_t or something? > # Currently, In every arch file, we are repeating the definition for > rte_xmm_t, Why not make, this generic definition > in common file. ie. rte_zmm_t or rte_512i_t definition in common > file(./lib/librte_eal/common/include/generic/rte_vect.h) I think there could be some arch specific thing that prevents it from being generic. > # Currently ./lib/librte_eal/common/include/generic/rte_vect.h has > defintion for rte_vXsY_t for vector representation, would that > be enough for public API? Do we need to new type? Definitions for rte_vXsY_tare almost the same as compiler's __m[128,256,512]i apart from alignment. Union types such as rte_zmm_t are very useful because of the ability to access parts of a wide vector register with an arbitrary granularity. For example, some old compiler don't support _mm512_set_epi8()/_mm512_set_epi16() intrinsics, so accessing ".u8[]" of ".u16[]" solves the problem. > > > [1] > rte_lpm_lookupx4(const struct rte_lpm *lpm, xmm_t ip, uint32_t hop[4], > uint32_t defv) > > >> + >> +#endif /* __AVX512F__ */ >> + >> #ifdef __cplusplus >> } >> #endif >> -- >> 2.7.4 >> -- Regards, Vladimir