X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;ds=sidebyside;f=lib%2Flibrte_member%2Frte_member_ht.c;h=cbcd0d44075a147bdf5690de0e44a61a849d5d9c;hb=c5a4428a783d173721ad0ed5486d058976737af8;hp=e038987b57b77b73ad04a595bfa703572f6e2d36;hpb=904ec78a239c249ff5fb688809d9a64e8242814e;p=dpdk.git diff --git a/lib/librte_member/rte_member_ht.c b/lib/librte_member/rte_member_ht.c index e038987b57..cbcd0d4407 100644 --- a/lib/librte_member/rte_member_ht.c +++ b/lib/librte_member/rte_member_ht.c @@ -1,34 +1,5 @@ -/*- - * BSD LICENSE - * - * Copyright(c) 2017 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. +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2017 Intel Corporation */ #include @@ -40,6 +11,10 @@ #include "rte_member.h" #include "rte_member_ht.h" +#if defined(RTE_ARCH_X86) +#include "rte_member_x86.h" +#endif + /* Search bucket for entry with tmp_sig and update set_id */ static inline int update_entry_search(uint32_t bucket_id, member_sig_t tmp_sig, @@ -136,6 +111,13 @@ rte_member_create_ht(struct rte_member_setsum *ss, for (j = 0; j < RTE_MEMBER_BUCKET_ENTRIES; j++) buckets[i].sets[j] = RTE_MEMBER_NO_MATCH; } +#if defined(RTE_ARCH_X86) + if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX2) && + RTE_MEMBER_BUCKET_ENTRIES == 16) + ss->sig_cmp_fn = RTE_MEMBER_COMPARE_AVX2; + else +#endif + ss->sig_cmp_fn = RTE_MEMBER_COMPARE_SCALAR; RTE_MEMBER_LOG(DEBUG, "Hash table based filter created, " "the table has %u entries, %u buckets\n", @@ -193,11 +175,23 @@ rte_member_lookup_ht(const struct rte_member_setsum *ss, *set_id = RTE_MEMBER_NO_MATCH; get_buckets_index(ss, key, &prim_bucket, &sec_bucket, &tmp_sig); - if (search_bucket_single(prim_bucket, tmp_sig, buckets, - set_id) || - search_bucket_single(sec_bucket, tmp_sig, - buckets, set_id)) - return 1; + switch (ss->sig_cmp_fn) { +#if defined(RTE_ARCH_X86) && defined(RTE_MACHINE_CPUFLAG_AVX2) + case RTE_MEMBER_COMPARE_AVX2: + if (search_bucket_single_avx(prim_bucket, tmp_sig, buckets, + set_id) || + search_bucket_single_avx(sec_bucket, tmp_sig, + buckets, set_id)) + return 1; + break; +#endif + default: + if (search_bucket_single(prim_bucket, tmp_sig, buckets, + set_id) || + search_bucket_single(sec_bucket, tmp_sig, + buckets, set_id)) + return 1; + } return 0; } @@ -221,13 +215,27 @@ rte_member_lookup_bulk_ht(const struct rte_member_setsum *ss, } for (i = 0; i < num_keys; i++) { - if (search_bucket_single(prim_buckets[i], tmp_sig[i], - buckets, &set_id[i]) || - search_bucket_single(sec_buckets[i], - tmp_sig[i], buckets, &set_id[i])) - num_matches++; - else - set_id[i] = RTE_MEMBER_NO_MATCH; + switch (ss->sig_cmp_fn) { +#if defined(RTE_ARCH_X86) && defined(RTE_MACHINE_CPUFLAG_AVX2) + case RTE_MEMBER_COMPARE_AVX2: + if (search_bucket_single_avx(prim_buckets[i], + tmp_sig[i], buckets, &set_id[i]) || + search_bucket_single_avx(sec_buckets[i], + tmp_sig[i], buckets, &set_id[i])) + num_matches++; + else + set_id[i] = RTE_MEMBER_NO_MATCH; + break; +#endif + default: + if (search_bucket_single(prim_buckets[i], tmp_sig[i], + buckets, &set_id[i]) || + search_bucket_single(sec_buckets[i], + tmp_sig[i], buckets, &set_id[i])) + num_matches++; + else + set_id[i] = RTE_MEMBER_NO_MATCH; + } } return num_matches; } @@ -244,12 +252,24 @@ rte_member_lookup_multi_ht(const struct rte_member_setsum *ss, get_buckets_index(ss, key, &prim_bucket, &sec_bucket, &tmp_sig); - search_bucket_multi(prim_bucket, tmp_sig, buckets, &num_matches, - match_per_key, set_id); - if (num_matches < match_per_key) - search_bucket_multi(sec_bucket, tmp_sig, - buckets, &num_matches, match_per_key, set_id); - return num_matches; + switch (ss->sig_cmp_fn) { +#if defined(RTE_ARCH_X86) && defined(RTE_MACHINE_CPUFLAG_AVX2) + case RTE_MEMBER_COMPARE_AVX2: + search_bucket_multi_avx(prim_bucket, tmp_sig, buckets, + &num_matches, match_per_key, set_id); + if (num_matches < match_per_key) + search_bucket_multi_avx(sec_bucket, tmp_sig, + buckets, &num_matches, match_per_key, set_id); + return num_matches; +#endif + default: + search_bucket_multi(prim_bucket, tmp_sig, buckets, &num_matches, + match_per_key, set_id); + if (num_matches < match_per_key) + search_bucket_multi(sec_bucket, tmp_sig, + buckets, &num_matches, match_per_key, set_id); + return num_matches; + } } uint32_t @@ -275,16 +295,34 @@ rte_member_lookup_multi_bulk_ht(const struct rte_member_setsum *ss, for (i = 0; i < num_keys; i++) { match_cnt_tmp = 0; - search_bucket_multi(prim_buckets[i], tmp_sig[i], - buckets, &match_cnt_tmp, match_per_key, - &set_ids[i*match_per_key]); - if (match_cnt_tmp < match_per_key) - search_bucket_multi(sec_buckets[i], tmp_sig[i], + switch (ss->sig_cmp_fn) { +#if defined(RTE_ARCH_X86) && defined(RTE_MACHINE_CPUFLAG_AVX2) + case RTE_MEMBER_COMPARE_AVX2: + search_bucket_multi_avx(prim_buckets[i], tmp_sig[i], buckets, &match_cnt_tmp, match_per_key, &set_ids[i*match_per_key]); - match_count[i] = match_cnt_tmp; - if (match_cnt_tmp != 0) - num_matches++; + if (match_cnt_tmp < match_per_key) + search_bucket_multi_avx(sec_buckets[i], + tmp_sig[i], buckets, &match_cnt_tmp, + match_per_key, + &set_ids[i*match_per_key]); + match_count[i] = match_cnt_tmp; + if (match_cnt_tmp != 0) + num_matches++; + break; +#endif + default: + search_bucket_multi(prim_buckets[i], tmp_sig[i], + buckets, &match_cnt_tmp, match_per_key, + &set_ids[i*match_per_key]); + if (match_cnt_tmp < match_per_key) + search_bucket_multi(sec_buckets[i], tmp_sig[i], + buckets, &match_cnt_tmp, match_per_key, + &set_ids[i*match_per_key]); + match_count[i] = match_cnt_tmp; + if (match_cnt_tmp != 0) + num_matches++; + } } return num_matches; } @@ -315,11 +353,24 @@ try_insert(struct member_ht_bucket *buckets, uint32_t prim, uint32_t sec, static inline int try_update(struct member_ht_bucket *buckets, uint32_t prim, uint32_t sec, - member_sig_t sig, member_set_t set_id) + member_sig_t sig, member_set_t set_id, + enum rte_member_sig_compare_function cmp_fn) { - if (update_entry_search(prim, sig, buckets, set_id) || - update_entry_search(sec, sig, buckets, set_id)) - return 0; + switch (cmp_fn) { +#if defined(RTE_ARCH_X86) && defined(RTE_MACHINE_CPUFLAG_AVX2) + case RTE_MEMBER_COMPARE_AVX2: + if (update_entry_search_avx(prim, sig, buckets, set_id) || + update_entry_search_avx(sec, sig, buckets, + set_id)) + return 0; + break; +#endif + default: + if (update_entry_search(prim, sig, buckets, set_id) || + update_entry_search(sec, sig, buckets, + set_id)) + return 0; + } return -1; } @@ -430,7 +481,7 @@ rte_member_add_ht(const struct rte_member_setsum *ss, */ if (ss->cache) { ret = try_update(buckets, prim_bucket, sec_bucket, tmp_sig, - set_id); + set_id, ss->sig_cmp_fn); if (ret != -1) return ret; }