220 41353 <fbfec82c-5416-4c96-b53b-ef3d4309b613@isocpp.org> article
Path: news.gmane.org!.POSTED!not-for-mail
From: joel.g.hemphill@gmail.com
Newsgroups: gmane.comp.lang.c++.isocpp.proposals
Subject: Optimizing Power Function for Integral Types
Date: Thu, 17 Jan 2019 08:02:13 -0800 (PST)
Lines: 351
Approved: news@gmane.org
Message-ID: <fbfec82c-5416-4c96-b53b-ef3d4309b613@isocpp.org>
Reply-To: std-proposals@isocpp.org
NNTP-Posting-Host: blaine.gmane.org
Mime-Version: 1.0
Content-Type: multipart/mixed; 
	boundary="----=_Part_159_387068105.1547740933607"
X-Trace: blaine.gmane.org 1547740813 29895 195.159.176.226 (17 Jan 2019 16:00:13 GMT)
X-Complaints-To: usenet@blaine.gmane.org
NNTP-Posting-Date: Thu, 17 Jan 2019 16:00:13 +0000 (UTC)
To: ISO C++ Standard - Future Proposals <std-proposals@isocpp.org>
Original-X-From: std-proposals+bncBC4Y55PCR4BBBB6OQLRAKGQEQHQ4S6A@isocpp.org Thu Jan 17 17:00:09 2019
Return-path: <std-proposals+bncBC4Y55PCR4BBBB6OQLRAKGQEQHQ4S6A@isocpp.org>
Envelope-to: gclcip-std-proposals@m.gmane.org
Original-Received: from mail-yb1-f197.google.com ([209.85.219.197])
	by blaine.gmane.org with esmtp (Exim 4.84_2)
	(envelope-from <std-proposals+bncBC4Y55PCR4BBBB6OQLRAKGQEQHQ4S6A@isocpp.org>)
	id 1gkA5Q-0007aP-Ch
	for gclcip-std-proposals@m.gmane.org; Thu, 17 Jan 2019 17:00:08 +0100
Original-Received: by mail-yb1-f197.google.com with SMTP id e205sf4267931yba.21
        for <gclcip-std-proposals@m.gmane.org>; Thu, 17 Jan 2019 08:02:19 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=isocpp-org.20150623.gappssmtp.com; s=20150623;
        h=date:from:to:message-id:subject:mime-version:x-original-sender
         :reply-to:precedence:mailing-list:list-id:list-post:list-help
         :list-archive:list-subscribe:list-unsubscribe;
        bh=wP75YkN+4dXd7pjj0Gg5aGbgjo01OfYAvkrl6ZHkMQY=;
        b=UzwCtUMB8+BzvYyM614PAP7obdaS+QmJHK6AjipVSGsvzZBrlE8gQMKLKncoC2lMVS
         ppeq0ygrNIQ/PO63g70u7NlHUU42ixf5AOx7FZz2JMZXuRYj1v0ZZrw7r07YGBQ8aq5I
         zJIqMu0fnhmOR5u/m84mNMFo00ajE1ERM0+U9wZKCxrAndiZCIuhROj66vER/kVWvE5W
         1nyy0XmOY/pBn9YLk5LGDSnUB3duMpuSK6OKztW2HCVeWApN6yWEYqWa5NXxbRF91xV6
         VrOER7WNZNrlNrp/k2hzOAVBBycw9lx0HJJOEhZdJIRsVhR+c+wPJoITwRDwhBHOsQYt
         85rA==
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=gmail.com; s=20161025;
        h=date:from:to:message-id:subject:mime-version:x-original-sender
         :reply-to:precedence:mailing-list:list-id:list-post:list-help
         :list-archive:list-subscribe:list-unsubscribe;
        bh=wP75YkN+4dXd7pjj0Gg5aGbgjo01OfYAvkrl6ZHkMQY=;
        b=VibLCk9L25KFzH8aaaQDk3HgBJAAAm3cepa5HFu1p10fKT/6D0ME5s4PASnBbfl0OT
         78TlLIE4m0AhaQwWUXXTuU8QkSC7+ykEen7i2jABzZU07vG7yYGFMNqB0MSxGiuyIdmP
         X2ClMX9bQJAQljPFEuPA9tOzgRdgxA2wnKuNCLfOg/EqW2k+9dAaCFjsjX3xgKjIqKnr
         sFDR1EHLj39QNqiCJyZXw+G2UhiXt2iyPD2/hq7yh4NfMy8pi+6bfY28g5QqIjEqwtYT
         hymss88GrER843yD5Anhh4yMNclXtmZHWOFjmWnlX77zZHa7MRJ95E1Q3KcfyeD+QgeU
         joIw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=1e100.net; s=20161025;
        h=x-gm-message-state:date:from:to:message-id:subject:mime-version
         :x-original-sender:reply-to:precedence:mailing-list:list-id
         :x-spam-checked-in-group:list-post:list-help:list-archive
         :list-subscribe:list-unsubscribe;
        bh=wP75YkN+4dXd7pjj0Gg5aGbgjo01OfYAvkrl6ZHkMQY=;
        b=QqCbVUk6VKxqmn3qTryRgyk35Kq3kfYQp1ocIhgD5U8xft7YMtCrSUB5J+bQZBPEPN
         46582zvTMMkG6Y50lkNIbBjDm0s5tp0+aRJCjxkTBjuGSxmvmI3ea+LCSiuN+g5WwxVL
         Pwt10FA1fPCcJT6xdFaBkIM/gB7o4IPHID3R8ZKwTzxyyHan7jlUV/5ALxQKCjLl4d0v
         eqPN+Ihod75sYctRPLxRVvUtmBIbXR1GcA1ulHM3plsflgM+QROgR3dA/J12NWIciXA/
         hajV2M+AxiDKlvwgnkpmsMDOvVe/PzkdHQVvJ/nRyosnIZDPdIQ5h1/TmR03DAlmSjNF
         XjlA==
X-Gm-Message-State: AJcUukfmLksDs23mJb3lvni8ETLGvxXxVequZvz5lLkAE7/L/1UC13Ah
	DrbP4M3cUb7z50BsoPr6bClFpA==
X-Google-Smtp-Source: ALg8bN6vs24jHsTE0doEVa3d0SeyNW9YbVuOB6DRirHxJk/5gPGOMWZyCi7mwLtPJRPc8LZFKX7zZQ==
X-Received: by 2002:a25:c64e:: with SMTP id k75mr1240550ybf.90.1547740938895;
        Thu, 17 Jan 2019 08:02:18 -0800 (PST)
X-BeenThere: std-proposals@isocpp.org
Original-Received: by 2002:a81:3084:: with SMTP id w126ls4371788yww.4.gmail; Thu, 17
 Jan 2019 08:02:14 -0800 (PST)
X-Received: by 2002:a81:450:: with SMTP id 77mr166682ywe.6.1547740934531;
        Thu, 17 Jan 2019 08:02:14 -0800 (PST)
X-Original-Sender: Joel.G.Hemphill@gmail.com
Precedence: list
Mailing-list: list std-proposals@isocpp.org; contact std-proposals+owners@isocpp.org
List-ID: <std-proposals.isocpp.org>
X-Spam-Checked-In-Group: std-proposals@isocpp.org
X-Google-Group-Id: 399137483710
List-Post: <https://groups.google.com/a/isocpp.org/group/std-proposals/post>, <mailto:std-proposals@isocpp.org>
List-Help: <https://support.google.com/a/isocpp.org/bin/topic.py?topic=25838>, <mailto:std-proposals+help@isocpp.org>
List-Archive: <https://groups.google.com/a/isocpp.org/group/std-proposals/>
List-Subscribe: <https://groups.google.com/a/isocpp.org/group/std-proposals/subscribe>,
 <mailto:std-proposals+subscribe@isocpp.org>
List-Unsubscribe: <mailto:googlegroups-manage+399137483710+unsubscribe@googlegroups.com>,
 <https://groups.google.com/a/isocpp.org/group/std-proposals/subscribe>
Xref: news.gmane.org gmane.comp.lang.c++.isocpp.proposals:41353
Archived-At: <http://permalink.gmane.org/gmane.comp.lang.c++.isocpp.proposals/41353>

------=_Part_159_387068105.1547740933607
Content-Type: multipart/alternative; 
	boundary="----=_Part_160_1686897718.1547740933607"

------=_Part_160_1686897718.1547740933607
Content-Type: text/plain; charset="UTF-8"

As of C++11, per overload 7 of the 'pow' function (
https://en.cppreference.com/w/cpp/numeric/math/pow), integral types can be 
used as parameters, but they will be cast to double before calculation. I 
believe that an integral-specific overload should be made, which makes use 
of faster integer-operations available to CPUs.

As a disclaimer, I am still a rather inexperienced programmer (College 
Sophomore), and I my have some misunderstands as to what would fall under 
the ISO standard and what would fall under compiler-implementations. As I 
understand it, the line about "If any argument has integral type, it is 
cast to double." is a component of the ISO standard.

As stated on isocpp.org's FAQ section, this idea is based on existing 
practices. As discussed here (
https://stackoverflow.com/questions/2398442/why-isnt-int-powint-base-int-exponent-in-the-standard-c-libraries), 
multiple implementations of this function have been made on a per-user 
basis, due to its general simplicity and lack of inclusion in previous 
standards. In the below testing, I created a function using x86 asm. It is 
worth noting that even with more standard C++ approaches, as testified in 
the stackoverflow discussion above, a significant performance improvement 
can be made.

For the sake of brevity, the data-table and source have been withheld, but 
if it is relevant to the conversation, I would be more than willing to 
provide them.

Do any of you agree that this is a useful addition to the C++ standards?

*Performance Testing:*
Tests were run on an Intel Core i3 6006U @ 2.0GHz

Custom Function (VS 2017) : 
__declspec(naked) __int32 __fastcall powi(__int32 base, __int32 exp) { 
__asm { ... } }

Test Range:

base: [-46340, 46340]  (int-truncation of the sqrt of MAX_INT)

exp: [-19, 19] (highest power of 3, that does not overflow the int type)


Results: (Approx. x20 avg. improvement)

[image: Untitled.png]


*Possible Use-Cases:*

Allocation of N-dimensional arrays, with N^M elements.

-- 
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/fbfec82c-5416-4c96-b53b-ef3d4309b613%40isocpp.org.

------=_Part_160_1686897718.1547740933607
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">As of C++11, per overload 7 of the &#39;pow&#39; function =
(<a href=3D"https://en.cppreference.com/w/cpp/numeric/math/pow">https://en.=
cppreference.com/w/cpp/numeric/math/pow</a>), integral types can be used as=
 parameters, but they will be cast to double before calculation. I believe =
that an integral-specific overload should be made, which makes use of faste=
r integer-operations available to CPUs.<div><br></div><div>As a disclaimer,=
 I am still a rather inexperienced programmer (College Sophomore), and I my=
 have some misunderstands as to what would fall under the ISO standard and =
what would fall under compiler-implementations. As I understand it, the lin=
e about &quot;<span style=3D"color: rgb(0, 0, 0); font-family: DejaVuSans, =
&quot;DejaVu Sans&quot;, arial, sans-serif; font-size: 12.8px; text-indent:=
 -64px;">If any argument has integral type,=C2=A0</span><span style=3D"colo=
r: rgb(0, 0, 0); font-family: DejaVuSans, &quot;DejaVu Sans&quot;, arial, s=
ans-serif; font-size: 12.8px; text-indent: -64px;">it is cast to double.&qu=
ot; is a component of the ISO standard.</span></div><div><span style=3D"col=
or: rgb(0, 0, 0); font-family: DejaVuSans, &quot;DejaVu Sans&quot;, arial, =
sans-serif; font-size: 12.8px; text-indent: -64px;"><br></span></div><div s=
tyle=3D"text-indent: 0px;"><span style=3D"color: rgb(0, 0, 0); font-family:=
 DejaVuSans, &quot;DejaVu Sans&quot;, arial, sans-serif; font-size: 12.8px;=
 text-indent: -64px;">As stated on isocpp.org&#39;s FAQ section, this idea =
is based on existing practices. As discussed here (</span><font color=3D"#0=
00000" face=3D"DejaVuSans, DejaVu Sans, arial, sans-serif"><a href=3D"https=
://stackoverflow.com/questions/2398442/why-isnt-int-powint-base-int-exponen=
t-in-the-standard-c-libraries" style=3D"font-size: 12.8px;">https://stackov=
erflow.com/questions/2398442/why-isnt-int-powint-base-int-exponent-in-the-s=
tandard-c-libraries</a><span style=3D"font-size: 12.8px;">), multiple imple=
mentations=C2=A0of this function have been made on a per-user basis, due to=
 its general simplicity and lack of inclusion in previous standards. In the=
 below testing, I created a function using x86 asm. It is worth noting that=
 even with more standard C++ approaches, as testified in the stackoverflow =
discussion above, a significant performance improvement can be made.</span>=
</font></div><div style=3D"text-indent: 0px;"><font color=3D"#000000" face=
=3D"DejaVuSans, DejaVu Sans, arial, sans-serif"><span style=3D"font-size: 1=
2.8px;"><br></span></font></div><div style=3D"text-indent: 0px;"><font colo=
r=3D"#000000" face=3D"DejaVuSans, DejaVu Sans, arial, sans-serif"><span sty=
le=3D"font-size: 12.8px;">For the sake of brevity, the data-table and sourc=
e have been withheld, but if it is relevant=C2=A0to the conversation, I wou=
ld be more than willing to provide them.</span></font></div><div style=3D"t=
ext-indent: 0px;"><font color=3D"#000000" face=3D"DejaVuSans, DejaVu Sans, =
arial, sans-serif"><span style=3D"font-size: 12.8px;"><br></span></font></d=
iv><div style=3D"text-indent: 0px;"><font color=3D"#000000" face=3D"DejaVuS=
ans, DejaVu Sans, arial, sans-serif"><span style=3D"font-size: 12.8px;">Do =
any of you agree that this is a useful addition to the C++ standards?</span=
></font></div><div><b><br></b></div><div><b>Performance Testing:</b></div><=
div><div><font size=3D"1">Tests were run on an Intel Core i3 6006U @ 2.0GHz=
</font></div><div><br></div><div>Custom Function (VS 2017) : <div class=3D"=
prettyprint" style=3D"background-color: rgb(250, 250, 250); border-color: r=
gb(187, 187, 187); border-style: solid; border-width: 1px; overflow-wrap: b=
reak-word;"><code class=3D"prettyprint"><div class=3D"subprettyprint"><span=
 style=3D"color: #000;" class=3D"styled-by-prettify">__declspec</span><span=
 style=3D"color: #660;" class=3D"styled-by-prettify">(</span><span style=3D=
"color: #000;" class=3D"styled-by-prettify">naked</span><span style=3D"colo=
r: #660;" class=3D"styled-by-prettify">)</span><span style=3D"color: #000;"=
 class=3D"styled-by-prettify"> __int32 __fastcall powi</span><span style=3D=
"color: #660;" class=3D"styled-by-prettify">(</span><span style=3D"color: #=
000;" class=3D"styled-by-prettify">__int32 </span><span style=3D"color: #00=
8;" class=3D"styled-by-prettify">base</span><span style=3D"color: #660;" cl=
ass=3D"styled-by-prettify">,</span><span style=3D"color: #000;" class=3D"st=
yled-by-prettify"> __int32 exp</span><span style=3D"color: #660;" class=3D"=
styled-by-prettify">)</span><span style=3D"color: #000;" class=3D"styled-by=
-prettify"> </span><span style=3D"color: #660;" class=3D"styled-by-prettify=
">{</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> __asm =
</span><span style=3D"color: #660;" class=3D"styled-by-prettify">{</span><s=
pan style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">...</span><span style=3D"col=
or: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color: #660;=
" class=3D"styled-by-prettify">}</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"> </span><span style=3D"color: #660;" class=3D"style=
d-by-prettify">}</span></div></code></div></div><div><br></div><div>Test Ra=
nge:</div><blockquote style=3D"margin: 0 0 0 40px; border: none; padding: 0=
px;"><div>base: [-46340, 46340]=C2=A0 (int-truncation of the sqrt of MAX_IN=
T)</div></blockquote><blockquote style=3D"margin: 0 0 0 40px; border: none;=
 padding: 0px;">exp: [-19, 19] (highest power of 3, that does not overflow =
the int type)</blockquote><div><br></div><div>Results: (Approx. x20 avg. im=
provement)</div><p class=3D"separator" style=3D"text-align: left; clear: bo=
th;"><img src=3D"cid:8babe2aa-8688-46ef-8cca-eca48b935eda" alt=3D"Untitled.=
png" width=3D"320" height=3D"183" style=3D"margin-left: 1em; margin-right: =
1em;"></p><p class=3D"separator" style=3D"text-align: left; clear: both;"><=
br></p><p class=3D"separator" style=3D"text-align: left; clear: both;"><b>P=
ossible Use-Cases:</b></p><p class=3D"separator" style=3D"text-align: left;=
 clear: both;">Allocation of N-dimensional arrays, with N^M elements.</p></=
div></div>

<p></p>

-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals&quot; group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/fbfec82c-5416-4c96-b53b-ef3d4309b613%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/fbfec82c-5416-4c96-b53b-ef3d4309b613=
%40isocpp.org</a>.<br />

------=_Part_160_1686897718.1547740933607--

------=_Part_159_387068105.1547740933607
Content-Type: image/png; name=Untitled.png
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename=Untitled.png
X-Attachment-Id: 8babe2aa-8688-46ef-8cca-eca48b935eda
Content-ID: <8babe2aa-8688-46ef-8cca-eca48b935eda>

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
AElFTkSuQmCC
------=_Part_159_387068105.1547740933607--

.
