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 1rmcMM-008wJ0-E0 for pgsql-hackers@arkaria.postgresql.org; Tue, 19 Mar 2024 16:30:43 +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 1rmcMK-00Gv1h-I8 for pgsql-hackers@arkaria.postgresql.org; Tue, 19 Mar 2024 16:30:41 +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 1rmcMK-00Gv1Y-5Y for pgsql-hackers@lists.postgresql.org; Tue, 19 Mar 2024 16:30:40 +0000 Received: from mail-ot1-x336.google.com ([2607:f8b0:4864:20::336]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1rmcMH-005OfY-KU for pgsql-hackers@postgresql.org; Tue, 19 Mar 2024 16:30:40 +0000 Received: by mail-ot1-x336.google.com with SMTP id 46e09a7af769-6e6775fd386so3007632a34.3 for ; Tue, 19 Mar 2024 09:30:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1710865835; x=1711470635; darn=postgresql.org; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=Ha399lD/fbJczlD4wRkpH44huKY+mmG7D5z7H5CAC34=; b=LS8Zbl8RXO/bnvJjOpih/lkk7nyXfvHze03pLCdppy44fq11vm0S5vJ6vsiZVVcaDk Af0V5IPRznEeJWts2Z/h6vWy/XvjytEqnKu7VFc3Kou5af/UlmLINcqpZTXqzPLcoNIN 1WG3jcfwlqMIQkTtvaOP92CX3RllwrUejgg2fwV1WPYatgD/xnbiiUlx0kd/5j1x+Mh7 QPY9Eb1jpY3IVzRASMlRb3Z6OpJoNS9tTaWXZ/WXAsPl4NhO6L7pPtnuGYdmsuNblWsA +wTVVUm14yHyad6VAvfL72NTlpl38wJqflQ9jfyYyOh+1Fu85lNXElgio/7CMho2MZpi IXUQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710865835; x=1711470635; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Ha399lD/fbJczlD4wRkpH44huKY+mmG7D5z7H5CAC34=; b=SM3hwPkXD5bJXE2LL7yMkqUP/ZzFj1C029RpNrDoLAq7KZdZWdA8OvtEaLaUADcnqY V78ULr2W7jGm8aSlOE7H0AP1FlzYYl3Fsl2KKLLqAknkIhzMOkt9Ndc3cZwQ2u8uiLt1 xRSpD5qP71Cc1It8hw0uv+mZAue+9FBVjXUICO379uLvxHPpRZ7RIbOuJECAAlJpYjBb 8awJwZjgmtN+cMQ2GoLBCcnZg1JOv52egE7IoxpIyrPvD/bWOtfIl1W+L54KP370IiKb OTANT5hMo9VrUpdfdci7UkV5KHr9Fn5jIODN0W/o1mknq/HblKOwwTX1ni4hsC8ckhyf OQ3Q== X-Forwarded-Encrypted: i=1; AJvYcCUby3kWUo0wv/t8Yg+eZsprmciDF/1UDIzltlH3lfceAlZVfw3sjGMrHUle9Uxz3IIvAHKMT8eGmZV0mSfcR/GNm3vt9LaGnjLEDoV3 X-Gm-Message-State: AOJu0YzoDYuUMMYm3YbfRveQ9QgFWS3qa9qyo+qo0O9j/JiPZUwh1MwY 3RGHkRF398VGWgzHCloA2S8PjQ0MzQl5qCAxMZGmvGXP06DxkUGT X-Google-Smtp-Source: AGHT+IF/2yFTkDBJcAaY3VIVS+B9ql0uLs78/H914cReUXC/1MZ8c5Q0uIT6Icn2tNtTqJEijxkMpw== X-Received: by 2002:a05:6870:8286:b0:221:46ea:6790 with SMTP id q6-20020a056870828600b0022146ea6790mr3390884oae.56.1710865835420; Tue, 19 Mar 2024 09:30:35 -0700 (PDT) Received: from nathanxps13 (162-195-168-172.lightspeed.stlsmo.sbcglobal.net. [162.195.168.172]) by smtp.gmail.com with ESMTPSA id g23-20020a02bb97000000b00476e44d5a4csm2946648jan.43.2024.03.19.09.30.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Mar 2024 09:30:34 -0700 (PDT) Date: Tue, 19 Mar 2024 11:30:33 -0500 From: Nathan Bossart To: John Naylor Cc: Ants Aasma , pgsql-hackers@postgresql.org Subject: Re: add AVX2 support to simd.h Message-ID: <20240319163033.GA952199@nathanxps13> References: <20240109162009.GA3033933@nathanxps13> <20240315174149.GA3837823@nathanxps13> <20240315194016.GA3896616@nathanxps13> <20240319020341.GA823987@nathanxps13> <20240319031601.GA828141@nathanxps13> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="oyUTqETQ0mS9luUI" Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --oyUTqETQ0mS9luUI Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit On Tue, Mar 19, 2024 at 04:53:04PM +0700, John Naylor wrote: > On Tue, Mar 19, 2024 at 10:16 AM Nathan Bossart > wrote: >> 0002 does the opposite of this. That is, after we've completed as many >> blocks as possible, we move the iterator variable back to "end - >> block_size" and do one final iteration to cover all the remaining elements. > > Sounds similar in principle, but it looks really complicated. I don't > think the additional loops and branches are a good way to go, either > for readability or for branch prediction. My sketch has one branch for > which loop to do, and then performs only one loop. Let's do the > simplest thing that could work. (I think we might need a helper > function to do the block, but the rest should be easy) I tried to trim some of the branches, and came up with the attached patch. I don't think this is exactly what you were suggesting, but I think it's relatively close. My testing showed decent benefits from using 2 vectors when there aren't enough elements for 4, so I've tried to keep that part intact. This changes pg_lfind32() to something like: if not many elements process one by one while enough elements for 4 registers remain process with 4 registers if no elements remain return false if more than 2-registers-worth of elements remain do one iteration with 2 registers do another iteration on last 2-registers-worth of elements -- Nathan Bossart Amazon Web Services: https://aws.amazon.com --oyUTqETQ0mS9luUI Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="johns_suggestion.patch" diff --git a/src/include/port/pg_lfind.h b/src/include/port/pg_lfind.h index b8dfa66eef..d154b61555 100644 --- a/src/include/port/pg_lfind.h +++ b/src/include/port/pg_lfind.h @@ -80,6 +80,34 @@ pg_lfind8_le(uint8 key, uint8 *base, uint32 nelem) return false; } +static inline bool +lfind32_2reg_helper(const Vector32 keys, uint32 *base) +{ + const uint32 nelem_per_vector = sizeof(Vector32) / sizeof(uint32); + Vector32 vals1, + vals2, + result1, + result2, + result; + + /* load the next block into 2 registers */ + vector32_load(&vals1, base); + vector32_load(&vals2, &base[nelem_per_vector]); + + /* compare each value to the key */ + result1 = vector32_eq(keys, vals1); + result2 = vector32_eq(keys, vals2); + + /* combine the results into a single variable */ + result = vector32_or(result1, result2); + + /* see if there was a match */ + if (vector32_is_highbit_set(result)) + return true; + + return false; +} + /* * pg_lfind32 * @@ -100,7 +128,8 @@ pg_lfind32(uint32 key, uint32 *base, uint32 nelem) */ const Vector32 keys = vector32_broadcast(key); /* load copies of key */ const uint32 nelem_per_vector = sizeof(Vector32) / sizeof(uint32); - const uint32 nelem_per_iteration = 4 * nelem_per_vector; + uint32 nelem_per_iteration = 4 * nelem_per_vector; + uint32 remaining; /* round down to multiple of elements per iteration */ const uint32 tail_idx = nelem & ~(nelem_per_iteration - 1); @@ -119,6 +148,9 @@ pg_lfind32(uint32 key, uint32 *base, uint32 nelem) } #endif + if (nelem < nelem_per_vector * 2) + goto slow_path; + for (i = 0; i < tail_idx; i += nelem_per_iteration) { Vector32 vals1, @@ -157,8 +189,21 @@ pg_lfind32(uint32 key, uint32 *base, uint32 nelem) return true; } } + + nelem_per_iteration = 2 * nelem_per_vector; + remaining = nelem - i; + + if (remaining == 0) + return false; + + if (remaining > nelem_per_iteration && + lfind32_2reg_helper(keys, &base[i])) + return true; + + return lfind32_2reg_helper(keys, &base[nelem - nelem_per_iteration]); #endif /* ! USE_NO_SIMD */ +slow_path: /* Process the remaining elements one at a time. */ for (; i < nelem; i++) { --oyUTqETQ0mS9luUI Content-Type: image/jpeg Content-Disposition: attachment; filename="reduce_branches.jpg" Content-Transfer-Encoding: base64 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 bVGkXqjd4TIukyLpMi6TIukyLpMi6TIukyLpMi6TIukyLpMi6TIukyLpMi6TIukyLpMi6TIu kyLpMi6TIukyLpMi6TIukyLpMi6TIukyLpMi6TIukyLpMi6TIukyLpMi6TIukyLpMi6TIuky LpMi6TIukyLpMi6TIukyLpMi6TIukyLpFKYd/Dy7gXy7tQg5RugWivSMYycosjCBztB3WlqV Ni58YUwEVt06GpsJP07gXy7tZG3YZ1F/eElevbYZQonsnmxYRi8YV4Jx/buBfLu2sflzvUI6 nDnrco/VU2e/cC+XdvKW+f8AJhNRb+F5UPEiwlDxY4jp8YRTqo9t+Frw9HUR7b8JvD0dRHtv wm/Mvl3OaAa1Nd8xUnx0/wBMVMLAmVFosFVTLWV/nOld7W4CVW8Tz8n5OO20zVL+N5167sg3 LKYHj9Pi65YEjAbgQXdHb+GcJ0YtbdE/hrfgPk/Tack6HDbA2X9M2Aaxdg3eMyrrMq6zKusy rrMq6zKusyrrMq6zKusyrrMq6zKusyrrMq6zKusyrrMq6zKusyrrMq6zKusyrrMq6zKusyrr Mq6zKusyrrMq6zKusyrrMq6zKusyrrMq6zKusyrrGOFdg8Y1SwJY8TMq6ylVCKLHhGaw6x8Z lXWVSyrbCeMA5OhtWGzZOiq8nL1V3yzgUj/UZSw4WCLfYdkyrrMq6xLgb/H5fGE06SJffhW0 PR00S+/CLXh6OmiX34RbmXy7mqf6TF/fmIUXI2xFO+XYgDxMNjfGQNkpJ4KOa9SmCfGNUp4r kW286ef07gXy7mqSn5fyNRLHoaQ22m2s5p8F/nTz+ncC+XczftKf+kc71D2RHrtmqn7hPP6d wL5dy7xCqcGij5c9WjTw9Crb4qLuUW+4Tz+ncC+XcdhvYza7Xmd4gXK3PUe+VbzHxdr/AHKe f0+Leq25FvHeoaZtTx4QpB998vygIQULDBs2jhKdOv0f2gNsA3EcJtYaxesN3jM66zOuszrr M66zOuszrrM66zOuszrrM66zOuszrrM66zOuszrrM66zOuszrrM66zOuszrrM66zOuszrrM6 6zOuszrrM66zOuszrrM66xBSYHxn2dIfvLtVWnbcMUopVt1TtmddZnXWU6dLC1RjsP6Z1v8A 5Eg/6v8A3Pt+Wl/3n47aiLTVxZRbfM66zOuszrrM66zOuszrrM66zOusSzA7fp8W9I7nW0C8 oKALTKjBxvxluUlAAhUYPE8ZTqV+j+zBtg4k8eZfLuCmP0jnPKnXrbtkzkfIrPxD6TGrj8Om Or96nn9P5L1HCj5z8xT9U/MU/VPzFP1TClZGY8AZUq0il0BbrC94qim9R8GIhOE+zV6tM0Q4 VR8zAKdOpUJpip1RwgrWvQZVw2G0kmG9N6ZHBoyLSqPgNmZRunKDZvsM2l5UPR1GWmLuwG6V G6Ooy0xd2A3RrU6jKmdlGWMEp1HCkBmUbBK6lHRabKMQtxt/eHqP0YbAanC8P2dTAKnRl7bA b2+5Xy+NKEMSPCbKbEy45Pb5mNV/p5+T8nHbafgU/TPy9P0yyKFHyH3qef0/kwVRcXvPwz6j Pwz6jPwz6jBUppZh85Upo1Poqi4etvX+8NShgbEgUhzbdAcQI6IJ+9yfrFLldlFaezxBMTk9 qTMoAIbKZUxWVWtamrEhYWVaSnhVBIYf3nK1pmnh5QN7HdstOV0A9O9Vb2N8V8Ntg4zldAPT vVW+E3xXw2sBxjt0PJqmOxvVG1Tb3nUWip2Yaq3Vl/vK+HBhqMjbT4W/tG5NdOhL4sV+ta97 WlSldbtW6T9sV/uV8vja9T9uYg7jKlKkvTVDsFp+XT/n7y3QIP8AnnKdflWGyeHwCef07gXy +KLU2VVBmP8AiOv4TGXDAb4W/UeZ6n6RDWYdeod/y+DTz+n8gZaZc33CflWn5Vp+VaBW5Oyg 8ZVSsoZUprhB+d9stykdIEpLhxeZ2+0tykdIEpLhxeZ2+05JVcszCogG3+rfCVFz4SsHpdXp P15eqJSpVRip9GzYTuJ2T+HqDFQQ1MKndvH+15/D1BioIamFTu3j/a8YVrulOsyU6e/F+0Cv 4k4b5fl96vl8Nc7ptU9H+qZif2lQAEHCd8B8TfnrLSrtSp09myfn39/7y1XljsvhFRdyi3wa ef0+5u67d1wSIt0yjCMJts8NkW6ZRhGE22eGyKGVrLuCuQPaBRew8TfmGMbtxBsRFTBYJlsb EfvFTBYJlsbEfvEGEjBlwuR/tMK4rf1MT/v9y9PGMSC7fKHC+4YtoI2eMwo2219oIuOZfL4Z vnsiIyg7OMuKSaRag8jFprSdmGyfkH9/7TZyF/f+0LOCHc32/DJ5/T4tuiANS3VvK9EUTiPJ 9vWuTtMA5L1ytJ724bN05OaBxBFYtbh8psI0i7Ru8JmXSZl0mZdJmXSZl0mZdJmXSZl0mZdJ mXSZl0mZdJmXSZl0mZdJmXSZl0mZdItsJJPhDWbquMom2iDEo1EwnFMONL+FoENWmGO4eMFL YXqHYLRUut952cZmXSZl0mZdJmXSZl0mZdJmXSZl0mZdJmXSZl0mZdJmXSZl0mZdJmXSZl0m ZdJmXSZl0mZdJmXSZl0mZdIlyN/h8u4F8vgBQVyq22zAtfqQtTrNcDWcmQm5B285q2HSblMS t07rWbrXjMeUFq3AmLyjlVQOyjYPik8/p3Avl8BXfw2c/VTGwayidfkLftefkH9/7Skr8nan SDbb/Gp5/TuBfL72oKVQBVM/FWdk6RzUFmY815X5U3FrL8u4E8/p3Avl9y7eAgY1iFPCW/iW wyk6kkcY3SVUVieJn5in6p+Yp+qMnInAppx8Zgui27WzbDi5SPDDeLTObee4E8/p3Avl/Ncz P7TP7RgjXN4i+A5if07ZUq1VuL2XbPwz6jPwz6jMNJbDuNPP6fFnBbFbZeVPtenwUiz3UDC3 CXep0uJGO0AWYSlTqVekFUHgBYicdIu/d+mdr0mXa4HzERaXmRbfL06eFfKdctTA8AdswMSW xwA0rn5pPwR6IrJdfEYTO16TO16TOjW+Kps3SnT23A29Uztekztekztekztekztekztekzte kztekztekztekztekztekztekztekztekztekztekztekztekztekztekztekztekztekzte kztekztekztekztekztekztekztekztekztekztekztekztekxN+/wAPl8Wyo2FiNjW3Q0Kl Sm1JgQcNOxPzvef4mr0gwFBZbb+PnFqVq3SFBZerbmXy5ujXKm+KT2E52xZFe9psWof2m1ai /O0I5OS1Q7BsgLctdWPDbPz7+/8AeJVrcoNXBuB7nTz+ncC+UJ7R2CVmbOyXhrfq2c7UuA2t Limo8hLOisPmJdKKA/Je6k8/p3AvlMX/AIkjL4i0wOGJx7hPw6ntPw6kq8obNUbu1PP6dwJS TO4gXjx5nq1QLA9SbhNw7uTz+ncDVm3LsHeaef0+NZ2NlUXJgQ06lMsLrjG+WO4wBRa+3vNP P6fG1qa5mU2lBxTqIKYOLGttp4TMRB1zuWWxnNbh4QnGcl5bGc1uHhCcZyXlsZzW4eEBxnJe WxnNbh4Q9c7m9pbGc1uHhD1zub2lsZzW4eEPXO5vaHrnYwHCHrnc3tM54eEPXO5vaZzw8Ieu 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 gpImaHMGSOyBg0oxd1DXloqQ26OQwCdEiBAIGBCIg7YXXVt4xqM4iiQASSwCfootmh8k6Ofh pYi9ip9ee+YJcQo4iyALFYGnDrlQ3uChskScsRcmKD+5ArFGA5CblNL7obIBABEvYOJAtwDY YXmYRH7RTghgGr7fUuECyQ27BQNSCc2KLRsRefoUAAAAgANEeCA8OSwW7JsQxNxkJRB1Ehog CxWBogBCDgwKmQ3DQyyZoHXohskScsRcmKdCBUBN9ETHBSDiA9h0agASgiAWkSEacGQYOLA0 BOCCyZpOKMQPu7DgTldLJRRHQh7MTA9IFD8isDROUCSBi7hiC6AwsGYIF2vA1CEGbGbuak6o 8wBnmF0cY4CgjYE6Dku6Au6gEYbUc6W4HACUP8E+qaMOogdCRKCZTdk1EzEj8AoCubehwLAG jKBTLiEpMpR+Q+rBCKcgwLB1AHpXscx2DqCh5uDEADOD4INAYIkkuS1JOpRbjXWARG9xLoUB 4vSRiaC9k4jADElWo50XtPICC6mI6xQ4+LExZQCgBCBoPm5IdOUM8/XsPhFPIj3FCiteBAIY yRtjLLQoI7KIaHDUmZVJ1PAZ69oQkHRGAs8ITewoODBGSwJNjVFUgeRWhep1/wDoP//aAAwD AQACAAMAAAAQ00w4wwwwwwwwwwwwwwwwwwwwwwwww88888888888888M8U88888888888888 8888888888o8888888888888888U888888888888888888888888o88888888888880w8U88 8888888888888888888888o888888888888888MkMMMMMMMMMMMMMMMMMMMMMKCNT8888888 888888888U888888888888888888888o9/C8888888888888408U888888888888888888s5 4l8Nk8888888888888osskMMMMMMMMMMMMMMMMMMnuqUWGI8888888888888888U88888888 8888888888+8y888o8888888888888888U888888888888888897mzm888o8888888888888 4wskMMMMMMMMMMMMMMMNcNedvMMMI86z2www080w08888U8888888888888q4W9vc88888o8 /wD7rLDPDLLHPPPPFPPPPPPPPPPMM7RIlPPPPPPPPKPPTjkMFEIFPPPPAEGMMMMMMMMMvsJC 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 lnEQEq1mUbB/+g//2Q== --oyUTqETQ0mS9luUI--