From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM03-CO1-obe.outbound.protection.outlook.com (mail-co1nam03on0087.outbound.protection.outlook.com [104.47.40.87]) by dpdk.org (Postfix) with ESMTP id 9588310D4A for ; Thu, 22 Dec 2016 13:48:11 +0100 (CET) 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=arNp2s1GPVGZFRTC8IplhpiDcDBSFKszBGUsx1iegic=; b=oN9O/lpgWGHyvRLeBDQZl4VjFcX6MQBn58p9CFD5/VqZk+leSYbTOk/nwvYDrYPR56VVNieMPzr83cii3ZRQ8ZRIpUWgXAKJ1gUjP17wzEK1ygijU9GskYYVn/BBl552+q7jE0NigGATcJ1OHazRr3I1fpB0vaM+B6MCiQ1CeTA= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Jerin.Jacob@cavium.com; Received: from localhost.localdomain (122.171.195.134) by BN3PR0701MB1719.namprd07.prod.outlook.com (10.163.39.18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.803.11; Thu, 22 Dec 2016 12:48:08 +0000 Date: Thu, 22 Dec 2016 18:17:54 +0530 From: Jerin Jacob To: David Hunt CC: , Message-ID: <20161222124753.GB8778@localhost.localdomain> References: <1480567821-70846-2-git-send-email-david.hunt@intel.com> <1482381428-148094-1-git-send-email-david.hunt@intel.com> <1482381428-148094-2-git-send-email-david.hunt@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: <1482381428-148094-2-git-send-email-david.hunt@intel.com> User-Agent: Mutt/1.7.1 (2016-10-04) X-Originating-IP: [122.171.195.134] X-ClientProxiedBy: MAXPR01CA0020.INDPRD01.PROD.OUTLOOK.COM (10.164.147.27) To BN3PR0701MB1719.namprd07.prod.outlook.com (10.163.39.18) X-MS-Office365-Filtering-Correlation-Id: d88904b8-579f-4243-0b82-08d42a68c8ac X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001); SRVR:BN3PR0701MB1719; X-Microsoft-Exchange-Diagnostics: 1; BN3PR0701MB1719; 3:k4rkqtsN+Hf5+h1G8JvaW4cTSAmoj7Xm4S0eoamWeTaJlOo2aFsf5KuoAIFjdr6KDBtobTWmDjjG4NXBLndElc0LgNiF6IxT8398lQRFNToqWY5pjwqPmt9AtX478hrBgYlLPjMrL6B2H3sEOntlVOk1BQHj8eFZ4+xjHGCvBlsxYhQBs5OHmtqEqrh7QRS933P3Pyi6yAxK/QdRziqOi/UWUYHzU7v+3T3VPHql5UdRVna0rziep2zNx+tpjckfY1vFjDSTp54ZarbXXF9tbQ==; 25:F2TWDyr21sXRux4KTzwZF4yl65l/27sB52q7mVW8aJA9V63H80sJaOrsRWgDGPAgRnvoODrzBtjVlW5Vc7uB/NPeSzWR049xtADkmM7rkKGa6fkxqoKcN1PsL0Y/1Wuw3cM2bG079oxvCpV1cHBu9M1g13qwXmtp/rCeFtp7SEpor9d2dwxZ1Qxl/EqrmJY3IlKO+qM/rINjuY83zAcDhHwugywt7Eyr67ZFUD7fDKpw0LUGDnpdFg2oKdnux5VQFDYUkVKpSjfQNS8qwv2YnzV2KikhgttAKCPGKy2qhQ02OSpQQBG6OWC5XY8oL8gniekIVkV5B3bwqGanAaaxVZbD3Ta3m6PhuJfl84hBeKjRqKH7/qQv4MUpBLtQB+ff45G2vlJG9fl15BxhuiNAub9Pwv8NjteAZKjthFS2RQdqrZtdrSy9PdnKLXYD+4AkYmIkWUlfNwusyetuOefCzA== X-Microsoft-Exchange-Diagnostics: 1; BN3PR0701MB1719; 31:smIan3P05T11CUrTv8ytJMMvSq4ANJ3ZHxBHDggoLkRaHBSV0DJV/nVyVN2Xq69z7FuRGSseS19WwozOdff7QVPMrVCyMB+OEGIdvdj4qrC4RAzXw1g/hsKagnekotIEOUTuA3lSX1xHFcGu1326UtcjI1RHqfWnrnIM2+5OnObf6i5KspEYsjZvTGnB+Ffx1z/niKfb6Aj1IhQXfNNGnuR/o+iwUJheRfIKC8sPnnJQakuxEtSA54qZLDoceyHDAmN4RmslqxPlFos+dveLVQ==; 20:UvgtkkatirxUx+n15imO1iUvTmOxyiAtO/C8M5qighxvDQJRfBKIYU9D9RzFkWFAP1c+OAmgxmpClJCXLLGjKAhANvstNTqrU5xU7XExqS2yZE3pDXhad9tVfm3OHglbm86j/z6BG/J9dI3z5W14mDS/1OmIkEukE0/Nq/JRbKb+226gBMKUnE1BXxXfummdYXj90E5iJRh+GdCKvE/P6oRkoDLVCsRdL56nUuS7C0+ehTf4OfQiaFmaPOBnNEvlAbjgLx9dYS1M8QbKKB5bNZlRr9IYFp13BhCm3AsCInPuictTtW6/2D2sOISt+x3+UjKCyYH8xP6k8dKTy9xToqMqJhyvwXg/5v4wMPCkHpRK085OJrlsZTBgziAcucPc3sNeWSCNfTrx7LaDoJFZLJInuA9FIDCb5vvtQQH7dTnA4xHxW7B5HXPUJemX7Q9s5tR6hk3zR4cXSrfRcNYSeNu3YmALCy7VOdgegZ4dkqcJ4MbHv36u/AYWG+GhDbTh5viFjcWszp8RGTUU9IrcGZcOh7Cw5t9fvU0/QAK1A4K7n8tthQRafxirSLGJU28LtB8PUAs/ZSNQomfbAhyAqsHgXqBdkrzKhxjDr5c4Wds= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(788757137089)(228905959029699); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040375)(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046)(6041248)(20161123562025)(20161123560025)(20161123564025)(20161123555025)(6072148); SRVR:BN3PR0701MB1719; BCL:0; PCL:0; RULEID:; SRVR:BN3PR0701MB1719; X-Microsoft-Exchange-Diagnostics: 1; BN3PR0701MB1719; 4:BDP7gmCd7PF7Bc/qJ8sZsjEw8XHoIl/knf69DCW8PFxaOhO3k3fz4p4gwsd5wF26HIbPQ/nJRH+UNUjpUUJuBspz5zh8wcZaJ/GDL/RyP8+IsH4E1jgomPm41Jd5UjQH6u2EnnzTNIUwE3yjOJ6nov3vAZD0xOFQbt8WSqJwopjNXhJCu9TPbNauyli5DCKkpk3RXiPpNIFk8F7iqFggjHfXgIpfAPT24lEHQu2jVs7/nZvTkVXRHxOfId9fRnxKQFTiwiVtHbMjLKoS2X0r46o4kFYa2idRMbZy9GkzwEuuC0GmNjkTU4Hps7xzV0paQPd0w+/CHNDWEZO3JeXhLXMsBEVMrZW9DVBjYo99+x8CCpfxvJZ9QLwb+cVfbCunMJymMzXfWbSvQ7A7JAzC6bowHe/O/VeFUoJ+uoO9cGt9r6038r+/x2JJkDW079UgLu75l79y3xgrI1s2UnEf6MLuzLONGkGaMyx8CQG+APkJ9Xw2Ixsw80JrogMAWmQya3BFzGSSlK+yuxKvaUidnMWcTtf50AGsk9BFPQNvQiqALFr6LCiLp6gbltqhqgfSQl7GyegjuMSYBEccnDIgvk9gJd8ACFVi7zbuFvxVKFinB9RqvfwQAK1RuQw2cH+mPa0llkuFObRemyb6+f/1kA== X-Forefront-PRVS: 01644DCF4A X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6069001)(6009001)(7916002)(39450400003)(199003)(189002)(24454002)(46406003)(42186005)(105586002)(76176999)(54356999)(50986999)(33656002)(97756001)(106356001)(101416001)(50466002)(61506002)(38730400001)(6506006)(189998001)(305945005)(68736007)(47776003)(66066001)(229853002)(1076002)(81166006)(81156014)(2906002)(8676002)(25786008)(97736004)(4001350100001)(3846002)(92566002)(6116002)(23726003)(5660300001)(4326007)(7736002)(9686002)(83506001)(42882006)(6916009)(6666003)(2950100002)(110136003)(18370500001); DIR:OUT; SFP:1101; SCL:1; SRVR:BN3PR0701MB1719; H:localhost.localdomain; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX: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; BN3PR0701MB1719; 23:87J5gY0XcgMyYPFeIEegquT2w5B/j9aa1frK8yx?= =?us-ascii?Q?7ftUbQQowHlduEZKY1dSEsK4gHlWGGerRF6ogvmw+6zvqV5BBECBijSU9ETo?= =?us-ascii?Q?hXhyrz0ziLt1BS6tua5Sa8CNtu5VVDdfo0jUtZGqD3QM397E08v6y9fDt0Xq?= =?us-ascii?Q?gagXk7JYBwItaw6bpwoQalpthSinlD/HoT/30yApNr9Tl+wSHYPaLX+z6Tin?= =?us-ascii?Q?wOygq0Mq1LXaj0Ek5dH15nrCtIrhQwdBbzDqwz6fuHYhTX0MKtYCG5IZb0eh?= =?us-ascii?Q?Vqcso2RT5KYGRPITkzlkYHc517uGUQLdWHe8+7qt/yPzzF+MS2e8si6EdrjD?= =?us-ascii?Q?di6aE8uQpYCVABjyUoDWEp2epMhWfu1SsbBdsM2HXMkB3ZSOLZn1ZdGbSzbW?= =?us-ascii?Q?ZLojRWNmgNeg5eb6+wGv+E0aCScsFjsmhS5t6iUBMVg96d/dQYC7rzqpaCkF?= =?us-ascii?Q?AHAeUYPU9Zu8zCLtcT1MXBgsFgOEg0U67vSl/Qme36SX/+2Vs5aa5f+sDGZ2?= =?us-ascii?Q?33fhwTawLNPcWbomxyzhU6HpMDnJdyWMWev3wEdpjA5JHZwwtFO/IVQJ/f1G?= =?us-ascii?Q?naK+zyQM3OaPnkoNaUb0j1IdQPBGJaXOtxAXKx8b1u9hH8HNEryXVBTYT8ou?= =?us-ascii?Q?YVg2t1AEbHC+F7jBninzsHeFaMsjclQ6W38r5HOfNq42zjyCAVOPwv6gN0vf?= =?us-ascii?Q?B77u0RBke4gZVnQZvu5606IlW5ZsGH1wWhkKjU2S+ZTjLPrBuerI8n5bKFOn?= =?us-ascii?Q?xjWXnEnsJ98WBlaR7tl26w7BrKsjh5FVjB8liWlqzXwj1e3AvdSSwNVehDjh?= =?us-ascii?Q?hWL51MnYaxc+zkOGH/XpKWuQ5cuohMXSJdP7waVj404sbNdhsSXMFJn49LkS?= =?us-ascii?Q?DIJEsoyJgdUPetq4X0tSsnZydzLUmWCnLfWzToAJ0g3xSCBcX1hiCBOzu5e2?= =?us-ascii?Q?vEGLqNwPm/AJsa2TiraHewwyAdVhsMdFVOKQX96U9KwyzEy6p2PfRpeBHNcH?= =?us-ascii?Q?w7xKYD42yqVrBYufY9h14oL0gQZ7m61pTZ6qKFRaSV6+blAS0hV5qFQA4lFz?= =?us-ascii?Q?tvgrek6LeE4acnbQ96Ko7nL+MY2or1mMINVN9gYSTCm7nSes/8L2zB2Oxv03?= =?us-ascii?Q?J0bLEMHP2lJZdM5eJDoGBgBLs35yrJsNq14GPVvQlG3lQdRBwjFsOH+b+s+f?= =?us-ascii?Q?MU716iJ0MCDckkVcq5O7EaQcwib60CjjS3Lxg2l7FQMREOn4ZvBC9qJUq5w?= =?us-ascii?Q?=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; BN3PR0701MB1719; 6:DNS9/W50gHYVIieHVRcMRY0ngon9oVWeClcHMhBq6u/pDTAyo7cfdoHsy7b6axI6S37+PwKuLFBGYiTVrg0Xjp7zewrvqqn0B2WB9jUahYN/vWviZP2HckfGLom4J1VjS6i2cB43uzW9Nxb+BL8FCjaspMucibwMHlCEko6yPXJ/AsvT7ybfezzxi3qt4ojtx0FmchZo6mhhXQ6MhdTzbl+fW8tGknAF3wk6Mg4UlTa7x5g/eyKt0k9/JfHLAsvIRmVPtknn/SAfmLB6xH0gcCuLx32cS8HMpmspnVOuIoWxnUrperd/AovgnrSYUyw5p4NO1ac7NKxanc6JqJV2CG6r6t0W7pFBZ/W7bbAeTo4SBETlACysHFU+wdqLlnrAtE8omv9fg+dYfJ+f/Fpw/3jQP8PaBuUWLaL2NCz3W8M=; 5:gtee6rKzMEnZ3CYmeexVi91nIEZ7OcYw10PUg1mT4zZEl1Ae8bjEKxk2ol76UOGcGd2VMiYPGfHeAghKPBCoOKfbrX7cyyx3X1ezCQY9FYRcec8dlIYkQ7gOp1PV1LP9etnRbzOg9NcTQi368BNRi9qt5W5zrg6IZCrGPtRaYXQ=; 24:IVDzOg1vjOotBB2xOS3iaZzHoFhTgZjeJRUZe+fhHh32PLLouxvHOMwK1lY7vFTm/VQuKR2eOUBEPlLvTuszUzjUalxPYCdV8GEdfEgh7EY= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BN3PR0701MB1719; 7:FKPUYZCh/LU8zer0b/A+z7t6vezgN40ECgVOzfzPlbEu2hGdKOefNgVLt5A5ZLOcilLtPr9Wmc7CTupdeOxZG/cknRhzxtiBBDfs3AePCx8YNL9REWHwfdPywQ2qYGex1Uxo/4baDwssipJHAx9hDTA/tO/JcyQPuI9XbeAzM9eFOsbkoK8nXPrqINLv3thnQjK+xQCYEjYsAVcZ1+dZa3WTNKbw6GU4rD8nyWQSNXt0wQI0aUGHvE/yg6hWaP/YDAEiYESm+AUtn75wEUkmnxTwOlgHvV/MiLqEiXl1VLwQ4mEdrUXXM7mWRXMePtIHtqSKIm6cwHIwpTS5U7yLouUAf9mG2kg1O6CwjK/upm1hbpyfUD56eal34iw5CEGpy5OrpihtaRwNDisC0txwhOggtr9yMK5NiSL1CVDtl9mJuP3FJcQIXcxMIiYyoiZIeBG0+Mrq2stK8xwBmg7Upw== X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Dec 2016 12:48:08.1363 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN3PR0701MB1719 Subject: Re: [dpdk-dev] [PATCH v2 1/5] lib: distributor performance enhancements 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: , X-List-Received-Date: Thu, 22 Dec 2016 12:48:12 -0000 On Thu, Dec 22, 2016 at 04:37:04AM +0000, David Hunt wrote: > Now sends bursts of up to 8 mbufs to each worker, and tracks > the in-flight flow-ids (atomic scheduling) > > New file with a new api, similar to the old API except with _burst > at the end of the function names > > Signed-off-by: David Hunt > + > +int > +rte_distributor_get_pkt_burst(struct rte_distributor_burst *d, > + unsigned int worker_id, struct rte_mbuf **pkts, > + struct rte_mbuf **oldpkt, unsigned int return_count) > +{ > + unsigned int count; > + uint64_t retries = 0; > + > + rte_distributor_request_pkt_burst(d, worker_id, oldpkt, return_count); > + > + count = rte_distributor_poll_pkt_burst(d, worker_id, pkts); > + while (count == 0) { > + rte_pause(); > + retries++; > + if (retries > 1000) { > + retries = 0; This retries write may not have any significance as it just before the return > + return 0; > + } > + uint64_t t = __rdtsc()+100; Use rte_ version of __rdtsc. > + > + while (__rdtsc() < t) > + rte_pause(); > + > + count = rte_distributor_poll_pkt_burst(d, worker_id, pkts); > + } > + return count; > +} > + > +int > +rte_distributor_return_pkt_burst(struct rte_distributor_burst *d, > + unsigned int worker_id, struct rte_mbuf **oldpkt, int num) > +{ > + struct rte_distributor_buffer_burst *buf = &d->bufs[worker_id]; > + unsigned int i; > + > + for (i = 0; i < RTE_DIST_BURST_SIZE; i++) > + /* Switch off the return bit first */ > + buf->retptr64[i] &= ~RTE_DISTRIB_RETURN_BUF; > + > + for (i = num; i-- > 0; ) > + buf->retptr64[i] = (((int64_t)(uintptr_t)oldpkt[i]) << > + RTE_DISTRIB_FLAG_BITS) | RTE_DISTRIB_RETURN_BUF; > + > + /* set the GET_BUF but even if we got no returns */ > + buf->retptr64[0] |= RTE_DISTRIB_GET_BUF; > + > + return 0; > +} > + > +#if RTE_MACHINE_CPUFLAG_SSE2 > +static inline void Move SSE version of the code to separate file so that later other SIMD arch specific version like NEON can be incorporated. > +find_match_sse2(struct rte_distributor_burst *d, > + uint16_t *data_ptr, > + uint16_t *output_ptr) > +{ > + /* Setup */ > + __m128i incoming_fids; > + __m128i inflight_fids; > + __m128i preflight_fids; > + __m128i wkr; > + __m128i mask1; > + __m128i mask2; > + __m128i output; > + struct rte_distributor_backlog *bl; > + > + /* > + * Function overview: > + * 2. Loop through all worker ID's > + * 2a. Load the current inflights for that worker into an xmm reg > + * 2b. Load the current backlog for that worker into an xmm reg > + * 2c. use cmpestrm to intersect flow_ids with backlog and inflights > + * 2d. Add any matches to the output > + * 3. Write the output xmm (matching worker ids). > + */ > + > + > + output = _mm_set1_epi16(0); > + incoming_fids = _mm_load_si128((__m128i *)data_ptr); > + > + for (uint16_t i = 0; i < d->num_workers; i++) { > + bl = &d->backlog[i]; > + > + inflight_fids = > + _mm_load_si128((__m128i *)&(d->in_flight_tags[i])); > + preflight_fids = > + _mm_load_si128((__m128i *)(bl->tags)); > + > + /* > + * Any incoming_fid that exists anywhere in inflight_fids will > + * have 0xffff in same position of the mask as the incoming fid > + * Example (shortened to bytes for brevity): > + * incoming_fids 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 > + * inflight_fids 0x03 0x05 0x07 0x00 0x00 0x00 0x00 0x00 > + * mask 0x00 0x00 0xff 0x00 0xff 0x00 0xff 0x00 > + */ > + > + mask1 = _mm_cmpestrm(inflight_fids, 8, incoming_fids, 8, > + _SIDD_UWORD_OPS | > + _SIDD_CMP_EQUAL_ANY | > + _SIDD_UNIT_MASK); > + mask2 = _mm_cmpestrm(preflight_fids, 8, incoming_fids, 8, > + _SIDD_UWORD_OPS | > + _SIDD_CMP_EQUAL_ANY | > + _SIDD_UNIT_MASK); > + > + mask1 = _mm_or_si128(mask1, mask2); > + /* > + * Now mask contains 0xffff where there's a match. > + * Next we need to store the worker_id in the relevant position > + * in the output. > + */ > + > + wkr = _mm_set1_epi16(i+1); > + mask1 = _mm_and_si128(mask1, wkr); > + output = _mm_or_si128(mask1, output); > + } > + > +/* process a set of packets to distribute them to workers */ > +int > +rte_distributor_process_burst(struct rte_distributor_burst *d, > + struct rte_mbuf **mbufs, unsigned int num_mbufs) > +{ > + unsigned int next_idx = 0; > + static unsigned int wkr; > + struct rte_mbuf *next_mb = NULL; > + int64_t next_value = 0; > + uint16_t new_tag = 0; > + uint16_t flows[8] __rte_cache_aligned; The const 8 has been used down in the function also. Please replace with macro > + //static int iter=0; Please remove the test-code with // across the patch. > + > + if (unlikely(num_mbufs == 0)) { > + /* Flush out all non-full cache-lines to workers. */ > + for (unsigned int wid = 0 ; wid < d->num_workers; wid++) { > + if ((d->bufs[wid].bufptr64[0] & RTE_DISTRIB_GET_BUF)) { > + release(d, wid); > + handle_returns(d, wid); > + } > + } > + return 0; > + } > + > + while (next_idx < num_mbufs) { > + uint16_t matches[8]; > + int pkts; > + > + if (d->bufs[wkr].bufptr64[0] & RTE_DISTRIB_GET_BUF) > + d->bufs[wkr].count = 0; > + > + for (unsigned int i = 0; i < RTE_DIST_BURST_SIZE; i++) { > + if (mbufs[next_idx + i]) { > + /* flows have to be non-zero */ > + flows[i] = mbufs[next_idx + i]->hash.usr | 1; > + } else > + flows[i] = 0; > + } > + > + switch (d->dist_match_fn) { > +#ifdef RTE_MACHINE_CPUFLAG_SSE2 Is this conditional compilation flag is really required ? i.e RTE_DIST_MATCH_SSE will not enabled in non SSE case > + case RTE_DIST_MATCH_SSE: > + find_match_sse2(d, &flows[0], &matches[0]); > + break; > +#endif > + default: > + find_match_scalar(d, &flows[0], &matches[0]); > + } > + > + /* > + * Matches array now contain the intended worker ID (+1) of > + * the incoming packets. Any zeroes need to be assigned > + * workers. > + */ > + > + if ((num_mbufs - next_idx) < RTE_DIST_BURST_SIZE) > + pkts = num_mbufs - next_idx; > + else > + pkts = RTE_DIST_BURST_SIZE; > + > + for (int j = 0; j < pkts; j++) { > + > + next_mb = mbufs[next_idx++]; > + next_value = (((int64_t)(uintptr_t)next_mb) << > + RTE_DISTRIB_FLAG_BITS); > + /* > + * User is advocated to set tag vaue for each > + * mbuf before calling rte_distributor_process. > + * User defined tags are used to identify flows, > + * or sessions. > + */ > + /* flows MUST be non-zero */ > + new_tag = (uint16_t)(next_mb->hash.usr) | 1; > + > + /* > + * Using the next line will cause the find_match > + * function to be optimised out, making this function > + * do parallel (non-atomic) distribution > + */ > + //matches[j] = 0; test code with //