From patchwork Thu Aug 31 10:46:55 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pavan Nikhilesh X-Patchwork-Id: 28147 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 570723255; Thu, 31 Aug 2017 12:47:56 +0200 (CEST) Received: from NAM03-CO1-obe.outbound.protection.outlook.com (mail-co1nam03on0042.outbound.protection.outlook.com [104.47.40.42]) by dpdk.org (Postfix) with ESMTP id 0F43A2E8F for ; Thu, 31 Aug 2017 12:47:53 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=PaXbKyVmbwXko5M/WBbmQiAMGOxuoh13pGbZuVBaeR0=; b=ZkiTDcRl10c1qD9Sj7mOK5EH91rZv9Uimu1c3oJoAgmvYDY0H/vmCaf8VkROmoeyDuuehDrOltviA4Aoom7YKsKQdxwKUl0PEZAw9MIGQJgcCbFLhzRQdhOP/7vsbmjQY/Iuov+Vdwhqnx/racIze+rvnMxeF5KtHDORSRxnGBA= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Pavan.Bhagavatula@cavium.com; Received: from PBHAGAVATULA-LT.caveonetworks.com (111.93.218.67) by DM5PR07MB3465.namprd07.prod.outlook.com (10.164.153.20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1385.9; Thu, 31 Aug 2017 10:47:49 +0000 From: Pavan Nikhilesh To: dev@dpdk.org Cc: cristian.dumitrescu@intel.com, stephen@networkplumber.org, Pavan Nikhilesh Date: Thu, 31 Aug 2017 16:16:55 +0530 Message-Id: <1504176415-5236-3-git-send-email-pbhagavatula@caviumnetworks.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1504176415-5236-1-git-send-email-pbhagavatula@caviumnetworks.com> References: <1504176415-5236-1-git-send-email-pbhagavatula@caviumnetworks.com> MIME-Version: 1.0 X-Originating-IP: [111.93.218.67] X-ClientProxiedBy: BM1PR01CA0082.INDPRD01.PROD.OUTLOOK.COM (10.174.208.150) To DM5PR07MB3465.namprd07.prod.outlook.com (10.164.153.20) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 5e29ad3e-852e-4a63-bdee-08d4f05dba23 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(2017030254152)(300000503095)(300135400095)(2017052603199)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095); SRVR:DM5PR07MB3465; X-Microsoft-Exchange-Diagnostics: 1; DM5PR07MB3465; 3:ioZYOu4wCPZVm32kL6Q3Lb+VUo1dmWiHhAz7SrPWS5tiyrsMbKIDr2u4HQHySW5lfq86GmCzjZd74RgTcOtL6B1KqUCBt1A/P55gYEByZy70faxJ/wkD3T88bFPc6sJHluntnNwZznF3GUPUUHeXGUul3LRGOF8WYFG58H46h16kWtfUt8HLdfKWk5bxuGEn3XaPSEtguURBGuOSvcfLtKQw3yRoSQ3SNrQE4416UrdRF+Ed9FWBJtKPEh48pP11; 25:620eWvjhlIkCOle+mPgavkt+Y0JT40J7CNiWO4iF3apDp5ri/oVHU2HigCeHaOqjNtDb3qn7pLvOa0+ugdwm3obKVlwpmef/Nc3sQCOqv55I0fvV3D9gR/dtEzmADTsOas9vqTnmI6Cyx+6LV6jUVkUizyysAWLUtR0EZlNwm9QQcIwvs/v9HXGrSii/zNBJRG0B8NZfSQiyhy4mRZn8dXtsvhebziQY7qVUHjFCqE2da/D3WZSk9oMc7rfxk1TCCEjd2G432LUvx+lCXMIOWrkUnXGcOT0WFpmzhwZNAGxex55hwBADJ6bHXgpmqpa00JDROIBlh+eyHje6cmlKbg==; 31:15FWpKm52mBhfBdZCJBjIWG/DUMzUNQ9rwaEsXvFr/8/QIictOdV45mU2EV5wm9U8bWhIcnIlrwYhpfL9KD08a1oogKP2XAu+bvj2Xsd7H+Mx5szWdNiiC2xUdATcjx4F5QXuO3Ch7PqMhtX19N3XAQQni5pyo1356zju/SCw3irwsIHe9rSvAD7C+FaCmRk1r3cT7mrd0iDkfS9QwKy+0K0jrCzzMn4HtsHlFWUa2Y= X-MS-TrafficTypeDiagnostic: DM5PR07MB3465: X-Microsoft-Exchange-Diagnostics: 1; DM5PR07MB3465; 20:agKwWIMYeZ1wT64x0orWubVM8GF8MgiTZNJ9NAokzWr8A/T82Dsy9nnL1q4i8pgqLZJdNmDyyIySgnPRR1IWmaLZiJIHLk7NFFgb9+ddzrbFq8onYv3egJUxJtZgftnStMSqFmKSm6XRVL6xB9itcLQT8LoEyUwbMZ5aT51jTTK4Xc3lLH26fO7XDCCT9T9sgUQikDa2cdi8AmBt09DGsyFsiZ1U8744KzCkcZB6/jKFQ29Gbje9SsV2ODi8NXrL82w+7NcK9brdNAeraVde4GDr7cAVSRQXnq9r8ttKMKYLOQcJsLT0gDOM6QhXhQ5zAxm7LBemBFaOz+wXTkC1rslQ+iHk069sEUDlSQpFJQj9v/i61+v9XPpnvRnDS7YCqCC5RdPR9kVFYKZmggt9X2fU8Wts6kxfPuGgTPWUzvY2lTqXJmdbb4ifrq6OQ+gp8+aZhSsm2TOWGvcqak4c+xiK9qJCsXtMMXCgD+O3yFDXGSFuQGWtw+6bfPZbYfB2GAKWirnZwy+1z/DEO3+GTaUDL0XkEjFBcWWI2d35skUvTNGwojR6wsv5F/BVqHTeKgB0D0hOjBoL0xtJp3+IqDGqhCzcnIwZxN3rhnHbb2k=; 4:Sr6Uryt3o2X0Wk3n31LXUbdJMGvEZyzShZHIt/x5rKSmVdhTw3DYpBFtOgPdOW9BZ+ge2ylkzzMz6+qJGHpovtgu8y9OsRyAAzkEdhJgoWd38OPBdBdsEgcVC1RmaMpGkAm2mttdNQv/3WgFECmmALWHEL04CMIVEpGKCJCmvrHxbct5IBpyYHaqj01Plgouf41+zEQjjUGRnK9Q5R/2fAy7H9nx1RWdXVQKaKdWBcvJpnRHwpfuao+/0lFR9Abi X-Exchange-Antispam-Report-Test: UriScan:; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046)(100000703101)(100105400095)(93006095)(6041248)(20161123558100)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123560025)(20161123562025)(20161123555025)(20161123564025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:DM5PR07MB3465; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:DM5PR07MB3465; X-Forefront-PRVS: 04163EF38A X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6009001)(189002)(199003)(50226002)(69596002)(6512007)(189998001)(72206003)(47776003)(110136004)(81166006)(66066001)(107886003)(81156014)(8936002)(5009440100003)(53936002)(8676002)(6116002)(6506006)(2906002)(97736004)(6486002)(36756003)(50466002)(3846002)(68736007)(305945005)(101416001)(2361001)(7736002)(5003940100001)(5660300001)(25786009)(478600001)(6916009)(2950100002)(42882006)(6666003)(48376002)(105586002)(33646002)(53416004)(4326008)(106356001)(76176999)(2351001)(50986999)(42186005)(42262002); DIR:OUT; SFP:1101; SCL:1; SRVR:DM5PR07MB3465; H:PBHAGAVATULA-LT.caveonetworks.com; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: cavium.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DM5PR07MB3465; 23:ZkPQbG+b2I4tr3W71f9+qiQhOi81XjmKb18fRnfVg?= NecJJmIig8zkK5WWgqXo1gQdEh15YU2X+J3dOPpl3bgWUgKjMw+RUZUI3X8hYv1JOCEvRlJmTkkEpWydM1ni/fDe/40Xmf+/bzxnUEewIjbJwO9rx8SymSthoooYql5Ylp9fDvNQhx19UT9rDMCSVcVe5+xB1cbWfLV1Z7g74GUxgaAa2AJiw5ol0NH6Tj3XOmnqZZ90u6QpqOtqQb8LKm0DLNZ81n14C9N+8L/KSXdaoNHGrKC0hiMvgTACNVBgksHO6RVOhEoodfATUIkHzoELZaWo45vbI/dq7hwHWUq2EZgxoaOYj4YyC63ncs4wuraJEu17Ym8+RfeR+ponBZv56GM4UkKqNBCnb6cvAtg8pyKJfNA4d89T/7E1qwd85/eKogA2V4+C9QE0sWZq+uaYXJPXYMogS3+hCDU1/Kh3z2wcvb+A11BwG55enHl4pMpgsbN7+78bK7OXquCfnEh81lxqGKMg7RLvMoWEb1idLgFKRn1qI/SAGmqqmAmhLE+tsuGnm3z6QulRh+xiV8YEW3GA43ErTF5aegKvkcDbET6gvZ7013jAL9CbKgT5AA1m0u+i9TucF+aEgW3UhmZYXBdBkxKHZXcqtIUZB+LZ/oz+E1S8EmrFX+FScFDsE9kGs91ljqIID6lyyVepFI3czFJuFeYehXBENtmt77JL6Td1lj7tMKbElm955uGb1l4btXzDWfAHBc7/wcWyUHG8PUsMUjdhT5Ul08pqcx/k5qAiCFnK8eMpf/dvmyjWKN0Ot5IBS4s1lRJdKVrzgVm9tBnsrpK2gsLGQVBH58mjbMEXed6FzTUOuvVVp8djTC0HOVdn+HFy6E0xt7RiDFgyQpIlMDikniBhoe2TCn+OhuAPHQQO/rf2AS3+0KCnPfLSWhXYUDA673f7qNwOSQC//b3KNUcNtSSTbT9bzu8nmaVXKgyr2E8ey364FA6e2M9tkesLfpXJRfGk0Pamre9dvt9uZG+1a/HZ1AvweXDuSNB0RhJS7W7aq0W2rdEU4f4NvPBpKCua3L1Qwbmg9ojleN/LBnSJQSUkdm6l7DGE8htIB4ptRF36qOxw1GF23HT5R3dlvL+GIBjqzKE/+/M6C3I6mg/MlUYUBcHSumnpuRm6Nk1Q2JMc/tJnQGF0vZ9Ks2NRnwrp9dh7jwgQrxw X-Microsoft-Exchange-Diagnostics: 1; DM5PR07MB3465; 6:uQfDdOy8H5vGaDul2LgaVKpuSKBeUvLts9sad451l8muUw2bwyfJW/PSDL/uY/RLLlKyx2BQD+uId2V4qAgSzhdTPa9HZxnJfT4ZsWjM6edrjA1aU3wpI400mLZHB1MyI4QrcCk6WYYcrjdObNYiOYWXLWoW6TfmurW4a1VS1tYQvPyvxe1hxps8YYUTPn1e6EakXHRMd0ZsY+MXJ/yC1ogX9T4dZdKGTfuy5zjgqAfiqvLgAiKvu2kG6g/1tKKB4mh80PhV8TBTgY90/z1keHIMwmjVqLv4Pn6W5l/PjsbGkusJ2+rnAFkzb4KHOcPt/u1oG7j/UWyiRHaqW/9vvw==; 5:GUnGem3+HyZpVoG8wrESAgIC98n/qNMpr0vCXueo3c8ce0HZZKlZN1MOQ3rAJt6bJDFtZHdtmf+Jz2Qt7JzUI1OOIOwTvmUWNiVib5VI8OcDSfXeVt47xMWKN8HwjMKIroYB+Pl+Uo0b5j8xhPZ4xA==; 24:xP23g9TOfIbpM3191bvK24n8jE+0gRskcUd2PVAaSQq/9x+eUhEO6sZ24xJBppr8bon5ODLdXVM/mK1ZkL/HBHuzIQG2KrLkkMAyEuRA9Tg=; 7:CKNYvZtbSJFBECWowwH3qlXy/pp1bDbdFZmRSihOHWcu+/BiU7jhXWnOJI4RwENbw9fRmc0XCmL5zYPJJYRWbVUOn03UmO1pACNZK+0rK1gaBH23TvudgDHPak9ideklCSOWjslAL5uiVf9vhJ3VuAuxDh544pHeSv/n54GH6GCbospoHwzEkCSQ77BS4dLY7zHHGkD7XiDuQxC+SXvM2o4ubnH8UDNQ45DYmhBZQ+o= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Aug 2017 10:47:49.4111 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 711e4ccf-2e9b-4bcf-a551-4094005b6194 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR07MB3465 Subject: [dpdk-dev] [PATCH v2 3/3] test: add tests for reciprocal based division 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" This commit provides a set of tests for verifying the correctness and performance of both unsigned 32 and 64bit reciprocal based division. Signed-off-by: Pavan Nikhilesh --- test/test/Makefile | 2 + test/test/test_reciprocal_division.c | 111 ++++++++++++++++++ test/test/test_reciprocal_division_perf.c | 183 ++++++++++++++++++++++++++++++ 3 files changed, 296 insertions(+) create mode 100644 test/test/test_reciprocal_division.c create mode 100644 test/test/test_reciprocal_division_perf.c diff --git a/test/test/Makefile b/test/test/Makefile index 42d9a49..6017862 100644 --- a/test/test/Makefile +++ b/test/test/Makefile @@ -94,6 +94,8 @@ SRCS-y += test_cycles.c SRCS-y += test_spinlock.c SRCS-y += test_memory.c SRCS-y += test_memzone.c +SRCS-y += test_reciprocal_division.c +SRCS-y += test_reciprocal_division_perf.c SRCS-y += test_ring.c SRCS-y += test_ring_perf.c diff --git a/test/test/test_reciprocal_division.c b/test/test/test_reciprocal_division.c new file mode 100644 index 0000000..8a445c3 --- /dev/null +++ b/test/test/test_reciprocal_division.c @@ -0,0 +1,111 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2014 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "test.h" + +#include +#include +#include + +#include +#include +#include +#include +#include + +#define MAX_ITERATIONS 1000000 +#define DIVIDE_ITER 100 + +static int +test_reciprocal_division(void) +{ + int i; + int result = 0; + uint32_t divisor_u32 = 0; + uint32_t dividend_u32; + uint32_t nresult_u32; + uint32_t rresult_u32; + uint64_t divisor_u64 = 0; + uint64_t dividend_u64; + uint64_t nresult_u64; + uint64_t rresult_u64; + struct rte_reciprocal_u32 reci_u32; + struct rte_reciprocal_u64 reci_u64; + + rte_srand(rte_rdtsc()); + printf("Validating unsigned 32bit division.\n"); + for (i = 0; i < MAX_ITERATIONS; i++) { + /* Change divisor every DIVIDE_ITER iterations. */ + if (i % DIVIDE_ITER == 0) { + divisor_u32 = rte_rand(); + reci_u32 = rte_reciprocal_value_u32(divisor_u32); + } + + dividend_u32 = rte_rand(); + nresult_u32 = dividend_u32 / divisor_u32; + rresult_u32 = rte_reciprocal_divide_u32(dividend_u32, + &reci_u32); + if (nresult_u32 != rresult_u32) { + printf("Division failed, expected %"PRIu32" " + "result %"PRIu32"", + nresult_u32, rresult_u32); + result = 1; + break; + } + } + + printf("Validating unsigned 64bit division.\n"); + for (i = 0; i < MAX_ITERATIONS; i++) { + /* Change divisor every DIVIDE_ITER iterations. */ + if (i % DIVIDE_ITER == 0) { + divisor_u64 = rte_rand(); + reci_u64 = rte_reciprocal_value_u64(divisor_u64); + } + + dividend_u64 = rte_rand(); + nresult_u64 = dividend_u64 / divisor_u64; + rresult_u64 = rte_reciprocal_divide_u64(dividend_u64, + &reci_u64); + if (nresult_u64 != rresult_u64) { + printf("Division failed, expected %"PRIu64" " + "result %"PRIu64"", + nresult_u64, rresult_u64); + result = 1; + break; + } + } + + return result; +} + +REGISTER_TEST_COMMAND(reciprocal_division, test_reciprocal_division); diff --git a/test/test/test_reciprocal_division_perf.c b/test/test/test_reciprocal_division_perf.c new file mode 100644 index 0000000..307b3d8 --- /dev/null +++ b/test/test/test_reciprocal_division_perf.c @@ -0,0 +1,183 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2014 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "test.h" + +#include +#include +#include + +#include +#include +#include +#include +#include + +#define MAX_ITERATIONS 1000000 +#define DIVIDE_ITER 100 + +static int +test_reciprocal_division_perf(void) +{ + int result = 0; + uint32_t divisor_u32 = 0; + uint32_t dividend_u32; + uint32_t nresult_u32; + uint32_t rresult_u32; + uint64_t divisor_u64 = 0; + uint64_t dividend_u64; + uint64_t nresult_u64; + uint64_t rresult_u64; + uint64_t cur_cyc; + uint64_t tot_cyc_n = 0; + uint64_t tot_cyc_r = 0; + uint64_t i; + struct rte_reciprocal_u32 reci_u32 = {0}; + struct rte_reciprocal_u64 reci_u64 = {0}; + + rte_srand(rte_rdtsc()); + printf("Validating unsigned 32bit division.\n"); + for (i = 0; i < MAX_ITERATIONS; i++) { + /* Change divisor every DIVIDE_ITER iterations. */ + if (i % DIVIDE_ITER == 0) { + divisor_u32 = rte_rand(); + reci_u32 = rte_reciprocal_value_u32(divisor_u32); + } + + dividend_u32 = rte_rand(); + cur_cyc = rte_rdtsc(); + nresult_u32 = dividend_u32 / divisor_u32; + tot_cyc_n += rte_rdtsc() - cur_cyc; + + cur_cyc = rte_rdtsc(); + rresult_u32 = rte_reciprocal_divide_u32(dividend_u32, + &reci_u32); + tot_cyc_r += rte_rdtsc() - cur_cyc; + if (nresult_u32 != rresult_u32) { + printf("Division failed, expected %"PRIu32" " + "result %"PRIu32"", + nresult_u32, rresult_u32); + result = 1; + break; + } + } + printf("32bit Division results:\n"); + printf("Total number of cycles normal division : %"PRIu64"\n", + tot_cyc_n); + printf("Total number of cycles reciprocal division : %"PRIu64"\n", + tot_cyc_r); + printf("Cycles per division(normal) : %3.2f\n", + ((double)tot_cyc_n)/i); + printf("Cycles per division(normal) : %3.2f\n\n", + ((double)tot_cyc_r)/i); + + tot_cyc_n = 0; + tot_cyc_r = 0; + printf("Validating unsigned 64bit division.\n"); + + for (i = 0; i < MAX_ITERATIONS; i++) { + /* Change divisor every DIVIDE_ITER iterations. */ + if (i % DIVIDE_ITER == 0) { + divisor_u64 = rte_rand(); + reci_u64 = rte_reciprocal_value_u64(divisor_u64); + } + + dividend_u64 = rte_rand(); + cur_cyc = rte_rdtsc(); + nresult_u64 = dividend_u64 / divisor_u64; + tot_cyc_n += rte_rdtsc() - cur_cyc; + + cur_cyc = rte_rdtsc(); + rresult_u64 = rte_reciprocal_divide_u64(dividend_u64, + &reci_u64); + tot_cyc_r += rte_rdtsc() - cur_cyc; + if (nresult_u64 != rresult_u64) { + printf("Division failed, expected %"PRIu64" " + "result %"PRIu64"", + nresult_u64, rresult_u64); + result = 1; + break; + } + } + printf("64bit Division results:\n"); + printf("Total number of cycles normal division : %"PRIu64"\n", + tot_cyc_n); + printf("Total number of cycles reciprocal division : %"PRIu64"\n", + tot_cyc_r); + printf("Cycles per division(normal) : %3.2f\n", + ((double)tot_cyc_n)/i); + printf("Cycles per division(normal) : %3.2f\n\n", + ((double)tot_cyc_r)/i); + + printf("Validating unsigned 64bit division with 32bit divisor.\n"); + for (i = 0; i < MAX_ITERATIONS; i++) { + /* Change divisor every DIVIDE_ITER iterations. */ + if (i % DIVIDE_ITER == 0) { + divisor_u64 = rte_rand() >> 32; + reci_u64 = rte_reciprocal_value_u64(divisor_u64); + } + + dividend_u64 = rte_rand(); + cur_cyc = rte_rdtsc(); + nresult_u64 = dividend_u64 / divisor_u64; + tot_cyc_n += rte_rdtsc() - cur_cyc; + + cur_cyc = rte_rdtsc(); + rresult_u64 = rte_reciprocal_divide_u64(dividend_u64, + &reci_u64); + tot_cyc_r += rte_rdtsc() - cur_cyc; + if (nresult_u64 != rresult_u64) { + printf("Division failed, expected %"PRIu64" " + "result %"PRIu64"", + nresult_u64, rresult_u64); + result = 1; + break; + } + } + printf("64bit Division results:\n"); + printf("Total number of cycles normal division : %"PRIu64"\n", + tot_cyc_n); + printf("Total number of cycles reciprocal division : %"PRIu64"\n", + tot_cyc_r); + printf("Cycles per division(normal) : %3.2f\n", + ((double)tot_cyc_n)/i); + printf("Cycles per division(normal) : %3.2f\n", + ((double)tot_cyc_r)/i); + + tot_cyc_n = 0; + tot_cyc_r = 0; + + return result; +} + +REGISTER_TEST_COMMAND(reciprocal_division_perf, test_reciprocal_division_perf);