From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by sourceware.org (Postfix) with ESMTPS id 17D60383442C; Fri, 5 Mar 2021 18:21:33 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 17D60383442C IronPort-SDR: DrmyDeKkPDhvrG8pTJgnu0n3wxaK6U3AnIJ/SyY7IBRnxQRM2dlzrj21BUhWf2SRrM8OkXYlnX rLUH4ok1W/yA== X-IronPort-AV: E=McAfee;i="6000,8403,9914"; a="185296827" X-IronPort-AV: E=Sophos;i="5.81,225,1610438400"; d="scan'208";a="185296827" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Mar 2021 10:21:30 -0800 IronPort-SDR: pXvW1HafxTMUQRz4z+7QvnPd+yWt9/rP3Z320QaE/iTYckk0QFtYxlpe/NR5Kyo8RK97y71fVy 1bRVUvxflC6A== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.81,225,1610438400"; d="scan'208";a="587221829" Received: from tjmaciei-desk.jf.intel.com (HELO tjmaciei-ctnr.jf.intel.com) ([10.54.75.8]) by orsmga005.jf.intel.com with ESMTP; 05 Mar 2021 10:21:29 -0800 From: Thiago Macieira To: libstdc++@gcc.gnu.org Cc: gcc-patches@gcc.gnu.org Subject: [PATCH 3/3] barrier: optimise by not having the hasher in a loop Date: Fri, 5 Mar 2021 10:21:28 -0800 Message-Id: <20210305182128.2071822-4-thiago.macieira@intel.com> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210305182128.2071822-1-thiago.macieira@intel.com> References: <20210305182128.2071822-1-thiago.macieira@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-9.1 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libstdc++@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libstdc++ mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 05 Mar 2021 18:21:34 -0000 Our thread's ID does not change so we don't have to get it every time and hash it every time. libstdc++-v3/ChangeLog: * include/std/barrier(arrive): move hasher one level up in the stack. --- libstdc++-v3/include/std/barrier | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libstdc++-v3/include/std/barrier b/libstdc++-v3/include/std/barrier index e09212dfcb9..4bb5642c164 100644 --- a/libstdc++-v3/include/std/barrier +++ b/libstdc++-v3/include/std/barrier @@ -94,7 +94,7 @@ It looks different from literature pseudocode for two main reasons: alignas(__phase_alignment) __barrier_phase_t _M_phase; bool - _M_arrive(__barrier_phase_t __old_phase) + _M_arrive(__barrier_phase_t __old_phase, size_t __current) { const auto __old_phase_val = static_cast(__old_phase); const auto __half_step = @@ -103,9 +103,7 @@ It looks different from literature pseudocode for two main reasons: static_cast<__barrier_phase_t>(__old_phase_val + 2); size_t __current_expected = _M_expected; - std::hash __hasher; - size_t __current = __hasher(std::this_thread::get_id()) - % ((_M_expected + 1) >> 1); + __current %= ((__current_expected + 1) >> 1); for (int __round = 0; ; ++__round) { @@ -163,12 +161,14 @@ It looks different from literature pseudocode for two main reasons: [[nodiscard]] arrival_token arrive(ptrdiff_t __update) { + std::hash __hasher; + size_t __current = __hasher(std::this_thread::get_id()); __atomic_phase_ref_t __phase(_M_phase); const auto __old_phase = __phase.load(memory_order_relaxed); const auto __cur = static_cast(__old_phase); for(; __update; --__update) { - if(_M_arrive(__old_phase)) + if(_M_arrive(__old_phase, __current)) { _M_completion(); _M_expected += _M_expected_adjustment.load(memory_order_relaxed); -- 2.30.1