Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sOZT8-00060V-UM for pgsql-hackers@arkaria.postgresql.org; Tue, 02 Jul 2024 09:06:35 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1sOZS7-000WTW-3f for pgsql-hackers@arkaria.postgresql.org; Tue, 02 Jul 2024 09:05:31 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sOZS5-000WTN-M3 for pgsql-hackers@lists.postgresql.org; Tue, 02 Jul 2024 09:05:31 +0000 Received: from fout6-smtp.messagingengine.com ([103.168.172.149]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sOZS3-0001Vs-Kt for pgsql-hackers@postgresql.org; Tue, 02 Jul 2024 09:05:29 +0000 Received: from compute6.internal (compute6.nyi.internal [10.202.2.47]) by mailfout.nyi.internal (Postfix) with ESMTP id 8B330138050D; Tue, 2 Jul 2024 05:05:25 -0400 (EDT) Received: from imap48 ([10.202.2.98]) by compute6.internal (MEProxy); Tue, 02 Jul 2024 05:05:25 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=compiler.org; h= cc:cc:content-type:content-type:date:date:from:from:in-reply-to :in-reply-to:message-id:mime-version:references:reply-to:subject :subject:to:to; s=fm2; t=1719911125; x=1719997525; bh=bqLQyAj4cJ 69Q6jiGWeZgMf+Wadvx3J2+d3cqMmxCX0=; b=j8CTE3vMKPo0GVfqNsVyNKhHRg II7p+NVSxf75NDWGjrCdGsB9ZVryReJQQpSEdBS57WAjqGrwqWN/ABDcFH7VO6H+ ez9+yU5EZdpZPczl6XbwIJR0CbsRD6nlTAnlYwg3YnKEjBb1gGHNtAXrmXWeACWP JfRC81DRp3xoWxNwHjvQiV6r9mLJgbUv28JOpoykGNDITbWd8csGzpYtX0OgDysz toApPEmXmeFleiAvhms3QSbfsGyATfJJAuosaWyZMmLS0a/vz9XwIJCqmyZnx1qn YGNdpIfps4Fz0yjw9x2tS7rG8un2HJgwnPd4JwHEdxUiYptniEjD1SWHOZHg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:in-reply-to :message-id:mime-version:references:reply-to:subject:subject:to :to:x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm2; t=1719911125; x=1719997525; bh=bqLQyAj4cJ69Q6jiGWeZgMf+Wadv x3J2+d3cqMmxCX0=; b=WGjXhNt352ldKVuNUNzaJ8aXHWjafj3yKzY5nBB+6i5C HIpq/4g8yF+NTX8UpMmYnN5kuLySbZapnVmLY8395Fg2orf210UZlQI9PRwUztMq ZvW7TGtrmEwFYRAIbcowk37vrBV5oC/5tn9h3lW7Yy0GYNH24Q3i21hA96kdMg1a 4rDQABkRiMqgWJduwhObcIFTL2/GQ12edF0caZyGViM42OIQvfP1OB7WjVo3r+Wj NqpjRic/Sc5q8foctdqmXwDLIH17q5vxl3iieewfquT2qAl2RuoWBfM0temB7QUZ XpGZLgxV6OVcpY/9vdOZrMzN9QhlsomqYxJQ6uEpSw== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeftddrudehgddutdcutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefofgggkfgjfhffhffvvefutgesthdtredtreertdenucfhrhhomhepfdflohgv lhculfgrtghosghsohhnfdcuoehjohgvlhestghomhhpihhlvghrrdhorhhgqeenucggtf frrghtthgvrhhnpefhfedugeffvddtteeluefhffekledtudekhfekkeeileelfffhfedt ffejgfejfeenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhroh hmpehjohgvlhestghomhhpihhlvghrrdhorhhg X-ME-Proxy: Feedback-ID: ic6394509:Fastmail Received: by mailuser.nyi.internal (Postfix, from userid 501) id A24F431A0065; Tue, 2 Jul 2024 05:05:24 -0400 (EDT) X-Mailer: MessagingEngine.com Webmail Interface User-Agent: Cyrus-JMAP/3.11.0-alpha0-566-g3812ddbbc-fm-20240627.001-g3812ddbb MIME-Version: 1.0 Message-Id: In-Reply-To: References: <44d2ffca-d560-4919-b85a-4d07060946aa@app.fastmail.com> <87zfr1e1uj.fsf@wibble.ilmari.org> <9ff90ff9-5ac1-4529-b2f4-f93b37734b9c@app.fastmail.com> <81348268-b9fd-4308-bf52-056070aa7c2a@app.fastmail.com> <8e909218-1965-4515-99e3-4bb5b625e004@app.fastmail.com> Date: Tue, 02 Jul 2024 11:05:03 +0200 From: "Joel Jacobson" To: "Dean Rasheed" Cc: =?UTF-8?Q?Dagfinn_Ilmari_Manns=C3=A5ker?= , pgsql-hackers Subject: Re: Optimize numeric multiplication for one and two base-NBASE digit multiplicands. Content-Type: text/plain List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On Tue, Jul 2, 2024, at 10:22, Dean Rasheed wrote: > Shortly after posting that, I realised that there was a small bug. This bit: > > case 2: > newdig = (int) var1digits[1] * var2digits[res_ndigits - 4]; > > isn't quite right in the case where rscale is less than the full > result. In that case, the least significant result digit has a > contribution from one more var2 digit, so it needs to be: > > newdig = (int) var1digits[1] * var2digits[res_ndigits - 4]; > if (res_ndigits - 3 < var2ndigits) > newdig += (int) var1digits[0] * var2digits[res_ndigits - 3]; > > That doesn't noticeably affect the performance though. Update attached. Nice catch. Could we add a test somehow that would test mul_var() with rscale less than the full result, that would catch bugs like this one and others? I created a new benchmark, that specifically tests different var1ndigits. I've only run it on Apple M3 Max yet. More to come. \timing SELECT setseed(0.12345); CREATE TABLE bench_mul_var_var1ndigits_1 (var1 numeric, var2 numeric); INSERT INTO bench_mul_var_var1ndigits_1 (var1, var2) SELECT random(0::numeric,9999::numeric), random(10000000::numeric,1e32::numeric) FROM generate_series(1,1e8); CREATE TABLE bench_mul_var_var1ndigits_2 (var1 numeric, var2 numeric); INSERT INTO bench_mul_var_var1ndigits_2 (var1, var2) SELECT random(10000000::numeric,99999999::numeric), random(100000000000::numeric,1e32::numeric) FROM generate_series(1,1e8); CREATE TABLE bench_mul_var_var1ndigits_3 (var1 numeric, var2 numeric); INSERT INTO bench_mul_var_var1ndigits_3 (var1, var2) SELECT random(100000000000::numeric,999999999999::numeric), random(1000000000000000::numeric,1e32::numeric) FROM generate_series(1,1e8); CREATE TABLE bench_mul_var_var1ndigits_4 (var1 numeric, var2 numeric); INSERT INTO bench_mul_var_var1ndigits_4 (var1, var2) SELECT random(1000000000000000::numeric,9999999999999999::numeric), random(10000000000000000000::numeric,1e32::numeric) FROM generate_series(1,1e8); /* * Apple M3 Max */ SELECT SUM(var1*var2) FROM bench_mul_var_var1ndigits_1; -- HEAD Time: 2986.952 ms (00:02.987) Time: 2991.765 ms (00:02.992) Time: 2987.253 ms (00:02.987) SELECT SUM(var1*var2) FROM bench_mul_var_var1ndigits_1; -- v2-optimize-numeric-mul_var-small-var1-arbitrary-var2.patch Time: 2874.841 ms (00:02.875) Time: 2883.070 ms (00:02.883) Time: 2899.973 ms (00:02.900) SELECT SUM(var1*var2) FROM bench_mul_var_var1ndigits_2; -- HEAD Time: 3459.556 ms (00:03.460) Time: 3304.983 ms (00:03.305) Time: 3299.728 ms (00:03.300) SELECT SUM(var1*var2) FROM bench_mul_var_var1ndigits_2; -- v2-optimize-numeric-mul_var-small-var1-arbitrary-var2.patch Time: 3053.140 ms (00:03.053) Time: 3065.227 ms (00:03.065) Time: 3069.995 ms (00:03.070) /* * Just for completeness, also testing var1ndigits 3 and 4, * although no change is expected since not yet implemented. */ SELECT SUM(var1*var2) FROM bench_mul_var_var1ndigits_3; -- HEAD Time: 3809.005 ms (00:03.809) Time: 3438.260 ms (00:03.438) Time: 3453.920 ms (00:03.454) SELECT SUM(var1*var2) FROM bench_mul_var_var1ndigits_3; -- v2-optimize-numeric-mul_var-small-var1-arbitrary-var2.patch Time: 3437.592 ms (00:03.438) Time: 3457.586 ms (00:03.458) Time: 3474.344 ms (00:03.474) SELECT SUM(var1*var2) FROM bench_mul_var_var1ndigits_4; -- HEAD Time: 4133.193 ms (00:04.133) Time: 3554.477 ms (00:03.554) Time: 3560.855 ms (00:03.561) SELECT SUM(var1*var2) FROM bench_mul_var_var1ndigits_4; -- v2-optimize-numeric-mul_var-small-var1-arbitrary-var2.patch Time: 3508.540 ms (00:03.509) Time: 3566.721 ms (00:03.567) Time: 3524.083 ms (00:03.524) > I think it'd probably be worth trying to extend this to 3 or maybe 4 > var1 digits, since that would cover a lot of "everyday" sized numeric > values that a lot of people might be using. I don't think we should go > beyond that though. I think so too. I'm working on var1ndigits=3 now. /Joel