From patchwork Tue Sep 5 11:38:36 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pavan Nikhilesh X-Patchwork-Id: 28368 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 7A9AD37AC; Tue, 5 Sep 2017 13:39:14 +0200 (CEST) Received: from NAM03-BY2-obe.outbound.protection.outlook.com (mail-by2nam03on0071.outbound.protection.outlook.com [104.47.42.71]) by dpdk.org (Postfix) with ESMTP id 9C73B5688 for ; Tue, 5 Sep 2017 13:39:12 +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=yrvQywKUWp0lg3r9yayS0C7FAvmnVL564EJwAk9+jN8=; b=QVS7RUiXh8Oui8g+kZ/fmfazeqLRbWBAgpRnLqi2XWkecVeCs+K/8TTWACluFpFjmKry4ieX+njaEm0PjtkTtxu3Qy5AbxjQZ2Fbsl2bBDfOl3+Biqz0W99aZM3gAeOwItYaNlKIeahjbw8fB3SLgHrxldI1ykOe9wWmqVKNx7M= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Pavan.Bhagavatula@cavium.com; Received: from PBHAGAVATULA-LT.caveonetworks.com (111.93.218.67) by CY4PR07MB3464.namprd07.prod.outlook.com (10.171.252.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.20.13.10; Tue, 5 Sep 2017 11:39:08 +0000 From: Pavan Nikhilesh To: cristian.dumitrescu@intel.com, stephen@networkplumber.org Cc: dev@dpdk.org, Pavan Bhagavatula Date: Tue, 5 Sep 2017 17:08:36 +0530 Message-Id: <1504611516-27404-3-git-send-email-pbhagavatula@caviumnetworks.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1504611516-27404-1-git-send-email-pbhagavatula@caviumnetworks.com> References: <1504611516-27404-1-git-send-email-pbhagavatula@caviumnetworks.com> MIME-Version: 1.0 X-Originating-IP: [111.93.218.67] X-ClientProxiedBy: BM1PR01CA0090.INDPRD01.PROD.OUTLOOK.COM (10.174.208.158) To CY4PR07MB3464.namprd07.prod.outlook.com (10.171.252.145) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 7715b53b-8609-4436-a7dd-08d4f452b9bf X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(300000502095)(300135100095)(22001)(2017030254152)(300000503095)(300135400095)(2017052603199)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095); SRVR:CY4PR07MB3464; X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB3464; 3:37FEDHJ0FjJcScRdZx6Wj5cG4L2m6yPWTlOOOaYl3VLWmwCwZHKYE7CtXt7F2uGhcd+TH/lgpDr6PXRM4CTOaXpGTtQinTEGxC4ky0Ow7sG7z28VnFGFYcuzXfI5qWbT5msiU6pFjejmJcf+FShgBWwEuEAt0SaKrvgwjYGld96C45PhyHj4ZX+v3+pGDxnTqdV1BgN8hnoPw3/VkeDrCT5Z16mTwTxYcxWJU9W+fX790YrxAaGH+7QLGJdHZpNT; 25:GIJst5l4g5/omjUFgR6xtvs8bX5xpOtlk2dsGE4Loqqx0gbIpe/pN2olcXAd50Fcuti+emFeVue8/rhcJTd2qK2EwKB+g9L9jqvxscJE9c9Puhkls7AIApGa2viaLTWWoNa2u874qHVGqyvWmjC/N8DQF4YVbv6WLTMExG/8ePsodgFdJBrFMCstgrxABSQXGJtC9IZBB3y98e7at4nLyWAkWMgUs076QxA6MUFITZPEuUpTEgMfjeYemWiueShrgEy+xmRz6uaFpHX4bx81QGBzqiBs3lQtHqvJ9bwkk5HeZlx6kHggR+k2z0umLHtT9HO7QvrLt+kAHOwaXucmCA==; 31:6hTQq5BB3d/Gu6GODgML8W/LUK/3m4HMQv0HSJsEp0PiDHwTCGRE547Q+uKuLv93Mzx+g02inc28YaJGj1RM5LlJPFMYhcfj0DsjQwLACdUEcFpcnqeX3hp1n3XDjniU54vjzAi5FEpa4UdpMzWtkA0+6mmwNwFV4IneJWdQ7087G7Sbz36asMxOul+yZUTZ9Mrqv1fX1aGrUQJx+aCktiy4qh5P1NuBihgLt/tts84= X-MS-TrafficTypeDiagnostic: CY4PR07MB3464: X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB3464; 20:YnLs3IpRoEy7YP7igrozSJWwMFYgirbcqIgYx7RW97oiKZ5SrZ9h10cY0Kva0ChL5qqaY92oSBLNOdBztBcBsgyKODm4ozpx7/3RvUV1y2rfSA0hyLFErOTn8LouNmm1PnQKR/csOKsAWyuAM2nO8A6h/wu4bwhB1OubNogP+fdIturJl8uhviOLULnD9MgGK8aU1Ex3P7o2NGX+CUrEld8ZvpBOHyUcqr1j/ArZv12UrxQVW4OU7dVz5j038XyOAtQoOmj1DhIRGUNQQwUDklwvyBveFHK7xoaMpNXryq1laDLiKLSc2rtYKQYIfAOl5NPvSeCdvIg3suUcE/PK8JgiVgx/FkR0GZU1Y8cOANMo/VzGffxnFOObeeqOOP3nJI6YTstggyuk4r72Pvv/lP6lt7S9P+AF2U17M/q1L4lywcxpR8KXiyIstfTznUJNRuyH/iaa0+Xmg+nHvOm3HyghJpLuDLvdcqGpd8Vn/K2QKafnlPwcwKSdEIixddctzEVGBZRm5ZoHBTqR6XIAmw9wSN0TiirQpGG3AeZ7qycRvYKUFSFmkm6mty9lYmAqXIjHG0k32H/BIIOVUFLGA3pZ8MfgJ75peHRF2iWLDIc=; 4:bs6nxnjM7spK58up2wZQjrlAcNzhG5DHfdlF2vslJcV0YY2tlXTDyYxEpQgi1iSOmTiqYqugvN50gZzAfCIEdwGMpmjgAl8vCElVF+HR3bdPnKoKWDk29EmxtuDjIGD3HlBCsGrDgHmzdAAyxDoK8cCZSDYnGV9wU6S4c11T8izdKI24ZlnJ+BSixb/BopNtKXyOKou3urYjqta4Pxh/3Gaf4eQ0yulXqBLLXktdwqPLcHojJFORwv5//1/QJxFM 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)(2401047)(8121501046)(5005006)(93006095)(100000703101)(100105400095)(10201501046)(3002001)(6041248)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123562025)(20161123555025)(20161123558100)(20161123560025)(20161123564025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:CY4PR07MB3464; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:CY4PR07MB3464; X-Forefront-PRVS: 0421BF7135 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6009001)(189002)(199003)(36756003)(68736007)(42186005)(189998001)(50466002)(305945005)(5003940100001)(7736002)(33646002)(66066001)(6512007)(69596002)(8676002)(53936002)(81156014)(81166006)(106356001)(105586002)(48376002)(47776003)(110136004)(53416004)(107886003)(5009440100003)(50986999)(50226002)(76176999)(8936002)(101416001)(97736004)(6116002)(6506006)(6486002)(3846002)(2950100002)(6666003)(478600001)(42882006)(72206003)(5660300001)(25786009)(4326008)(2906002)(42262002); DIR:OUT; SFP:1101; SCL:1; SRVR:CY4PR07MB3464; 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; CY4PR07MB3464; 23:BIqRZ40HeZZJAp9WPrNNnAn/LcBwhw8bCIhEwp4/c?= XdYGvIx38GBwG5GLO8tcJ3yZmu3YTdkthVH8phFI3AIe1e0N6rC7XQlb8BP6Fthdv+R8oPN1Ryx/WJke5VAkHvi8QBMvdn9cCFoj22V723yx92YYjtS3CYN+t2mcqBlQ7e1I48SZa7A8lAbataafQPnFLyluZjey4CdR7d6oLv/52ksis8KVWfXWKA4kjigxkoyjNYhITaSXdVZd+YdZclKri3BhTmyLfKzoVV6ZATpNVJnjCvHQewHsC9kwHt33UdVlPz7lqUsHYgqGvIirn1k1rWqgJl3xl2noTLXXpPM1BmaN4ZVSjlxZRWsJu5q8NlSpXknjpga7mOSrCdIP8H9KQc5RE//NOVWu6ApbkQzHcSU4f6mThwsLhwPXzK4DhpokQQnwPs/YMlWf3arhp5pZQ+12tK8hMP2DhhqLItidjPfA9FhpGlslUYJ7ed/Ot6R9+FJI4KSUB1G7quiyng8BtIQZWWO3jeLuIb2KACsLZKi1aft8mGni+YnF10pWkPame7rfTtsVnjTklv0CaiPzbIJvPvurZXcxkkmoPf3DrnOxtHjUIuz+NwB3ZnRLTUgr5ZYMzM/wuvSptR7glg5uOf648ihRmEUmZs/0Zip6md4r7M0jBz4QIyhvMvyG0r/y3gNPMO18CSMMamzzOdrPUByt7pmP2UL7ZzloyBLmdpIJGNyRG3l2MC6kvjx9VdTqZwg4//UAuSm0HgPx9wG3yS6lKvfnQ6VWrtdkuRvxx8dOTaIrk1D++0kltTvzX7mWOK/JjzgZ0lhxqyYc60igx9+6AztbYfablVCpKt92FZJ8HmTAM3UxGaRBeHh2eH++UlXI9fqQX8eI8Exvs0IFML8Ba1pGMqJODvZ+GkORC4eQLwJqW1kV6HV8BqptXD81ogwor6okPz+9Xjvgj/y7nxhHYRIIlOio/BujWxaAoaVaCqxAH5wPCaVAr6Q1tpbZuYjjsPB7jyt+0u5sO3z3c2jpPDYpTmRJlnKUefw9cB6XqD+lHL8NSV9Sy6hCplq48loA5vkCnHji5vnOX/e+tnG0ie221ZY6qgzihFRPd6ToJ3f8IaenKISTM5tsIQ20pJihCm9qkkqEc756BYK X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB3464; 6:YZ45Z2kOJSQQSqjjNb+BNsMXHwgWDdSD1Y+rLq6U5RJeBet/bGKDodCK+tsZhVRiG6ET3qqFNtOe1RAWWph0+tocgRYYGp0BJC9bP7Wk/zAkhqC45ZxtrMF91CiC8gQYI6rYSwNNl4fUpjHIFyuMXQeK1IKHAMb7Z0JWGNAPyvUSKi0CSkoVxYFDExVYs+4qZ3LyEDQRbuX2JnAPvLuakqS2itnzPIe1luYptz4uoJ+q+716pmI6vKS1TQgoFtGOyCaVX/UmgHDGV5u2tsxJ3UPrFdT6/Rgd95T1sAfBPpEolWuAO2D9zitOB4iFmc+fcHxpMZqyrNF03CTW/88yZg==; 5:N48cjADuRXxP431RIgqq83QblhMDQswYLc+TVya8vnnJDtjCDdFRZg9yEveVNDQj0KgMTJn7M7fLYZj2wQaUPcbG241IHb36iVeiKz+3zkSwG4lj4HHqSmYPLQRJhbNiKU6o0+nCUJDj1at/edDtQg==; 24:ELXTJihD6D9+t0WH9AjArea/70VmwQ+8JovsI8KkKd5Y21sgdfseFQu69e4SXo8sSij5YZGLZ9cLYVv005jwLuAeNs0naxe2brmnGvYydzM=; 7:30smoTLXOEK1PSGF5t72s9WPHxMfTpyE/NxaxZManrVoxWCQ7elLkd6as53E4yvZdwUxWYji653A+Glo5tFVhcVwqBvRerceGVcFYAfDmlythzEnQOnPTaiigrlnQR5pzXQDHZRdnd5yELBSjtWQfnSewv/1IhWUN/RtlaVYu1iAX/vCn4I6Lft6PpOeCXK7/JiFT6VUrMEFjBFMkOXJS6kwwgC5WGpG4eZJL/EQz7A= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Sep 2017 11:39:08.8954 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 711e4ccf-2e9b-4bcf-a551-4094005b6194 X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4PR07MB3464 Subject: [dpdk-dev] [PATCH v5 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" From: Pavan Bhagavatula 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 | 109 +++++++++++++++++ test/test/test_reciprocal_division_perf.c | 193 ++++++++++++++++++++++++++++++ 3 files changed, 304 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..771ea64 --- /dev/null +++ b/test/test/test_reciprocal_division.c @@ -0,0 +1,109 @@ +/* + * BSD LICENSE + * + * Copyright (C) Cavium, Inc. 2017. + * + * 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 Cavium, Inc 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 + +#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..3eaf575 --- /dev/null +++ b/test/test/test_reciprocal_division_perf.c @@ -0,0 +1,193 @@ +/* + * BSD LICENSE + * + * Copyright (C) Cavium, Inc. 2017. + * + * 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 Cavium, Inc 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 + +#define MAX_ITERATIONS 1000000 +#define DIVIDE_ITER 100 + +static int +test_reciprocal_division_perf(void) +{ + int result = 0; + uint32_t divisor_u32 = 0; + volatile uint32_t dividend_u32; + uint32_t nresult_u32; + uint32_t rresult_u32; + uint64_t divisor_u64 = 0; + volatile uint64_t dividend_u64; + uint64_t nresult_u64; + uint64_t rresult_u64; + uint64_t start_cyc; + uint64_t split_cyc; + uint64_t end_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(); + + start_cyc = rte_rdtsc(); + nresult_u32 = dividend_u32 / divisor_u32; + split_cyc = rte_rdtsc(); + rresult_u32 = rte_reciprocal_divide_u32(dividend_u32, + &reci_u32); + end_cyc = rte_rdtsc(); + + tot_cyc_n += split_cyc - start_cyc; + tot_cyc_r += end_cyc - split_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(reciprocal) : %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(); + + start_cyc = rte_rdtsc(); + nresult_u64 = dividend_u64 / divisor_u64; + split_cyc = rte_rdtsc(); + rresult_u64 = rte_reciprocal_divide_u64(dividend_u64, + &reci_u64); + end_cyc = rte_rdtsc(); + + tot_cyc_n += split_cyc - start_cyc; + tot_cyc_r += end_cyc - split_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(reciprocal) : %3.2f\n\n", + ((double)tot_cyc_r)/i); + + tot_cyc_n = 0; + tot_cyc_r = 0; + + 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(); + + start_cyc = rte_rdtsc(); + nresult_u64 = dividend_u64 / divisor_u64; + split_cyc = rte_rdtsc(); + rresult_u64 = rte_reciprocal_divide_u64(dividend_u64, + &reci_u64); + end_cyc = rte_rdtsc(); + + tot_cyc_n += split_cyc - start_cyc; + tot_cyc_r += end_cyc - split_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(reciprocal) : %3.2f\n", + ((double)tot_cyc_r)/i); + + return result; +} + +REGISTER_TEST_COMMAND(reciprocal_division_perf, test_reciprocal_division_perf);