<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Rolf, the rationale is not clear at all to me: "to facilitate type casting" is self-understood or a canonical term of art. I've been programming in C for 40 years... and I never would write the API as we have done it there.  </div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
For pointers, out arguments are literally truthful: void **ptr is an out argument of a void pointer, and void *ptr is an in argument of a void pointer.</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
{Years ago, before there was void *, we would have written char **ptr for a char out argument (and cast it to whatever type we wanted), and char *ptr for an in point argument. }</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
The fact that a void ** can stand in the place of a void * is clearly a weakened typing in the language, because void * can point at anything (unknown).  Since a void * is a pointer, it can also hold a pointer to a pointer to void, sure.   But the intent of
 the second * is to remind you that you have an out argument.  And you *must* pass a pointer to a pointer for the API to work in C.</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Somehow this is helping the Fortran and C_PTR API of Fortran, as it states.  So the C API is made this way for convenience of Fortran.</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
The rationale shows the argument with the & to pass the pointer to the API by reference.  But, the rationale is not necessarily normative.  A reasonable person reads the standard,  sees void * and passes the baseptr without the &.  </div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Seems like a bad API to me.</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Tony</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div id="Signature">
<div>
<div id="divtagdefaultwrapper" dir="ltr" style="font-size:12pt; color:#000000; font-family:Calibri,Helvetica,sans-serif">
<p style="margin-top: 0px; margin-bottom: 0px;">Anthony Skjellum, PhD</p>
<p style="margin-top: 0px; margin-bottom: 0px;">Professor of Computer Science and Chair of Excellence</p>
<p style="margin-top: 0px; margin-bottom: 0px;">Director, SimCenter</p>
<p style="margin-top: 0px; margin-bottom: 0px;">University of Tennessee at Chattanooga (UTC)</p>
<p style="margin-top: 0px; margin-bottom: 0px;">tony-skjellum@utc.edu  [or skjellum@gmail.com]</p>
<p style="margin-top: 0px; margin-bottom: 0px;">cell: 205-807-4968</p>
<p style="margin-top: 0px; margin-bottom: 0px;"><br>
</p>
</div>
</div>
</div>
</div>
<div id="appendonsend"></div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> mpi-forum <mpi-forum-bounces@lists.mpi-forum.org> on behalf of Rolf Rabenseifner via mpi-forum <mpi-forum@lists.mpi-forum.org><br>
<b>Sent:</b> Wednesday, October 14, 2020 1:32 PM<br>
<b>To:</b> Main MPI Forum mailing list <mpi-forum@lists.mpi-forum.org><br>
<b>Cc:</b> Rolf Rabenseifner <rabenseifner@hlrs.de><br>
<b>Subject:</b> Re: [Mpi-forum] Question about MPI_Alloc_mem</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">Dear Tony, <br>
<br>
please read MPI-3.1 page 338, lines 36-41.<br>
Do these lines resolve your question?<br>
<br>
Best regards<br>
Rolf <br>
<br>
----- Original Message -----<br>
> From: "Main MPI Forum mailing list" <mpi-forum@lists.mpi-forum.org><br>
> To: "Main MPI Forum mailing list" <mpi-forum@lists.mpi-forum.org><br>
> Cc: "Anthony Skjellum" <skjellum@gmail.com><br>
> Sent: Wednesday, October 14, 2020 7:01:54 PM<br>
> Subject: [Mpi-forum] Question about MPI_Alloc_mem<br>
<br>
> Folks, I know we have had this function for a long time, and I've implemented<br>
> ports of MPI that actually use it (e.g., with pre-pinned memory). But, I am<br>
> trying to understand the logic for why baseptr is passed by value, instead of<br>
> by reference. In C, everything is by value, so the last argument in normal C<br>
> programs would be void **baseptr.<br>
> <br>
> The standard has:<br>
> int MPI_Alloc_mem(MPI_Aint size, MPI_Info info, void *baseptr);<br>
> Now, MPICC/GCC takes this with<br>
> void *memory = (void *)0;<br>
> int error = MPI_Alloc_mem(1024, MPI_INFO_NULL, &memory);<br>
> and you get the memory allocated properly.<br>
> What is more, this is incorrect:<br>
> int error = MPI_Alloc_mem(1024, MPI_INFO_NULL, memory);<br>
> although it compiles fine because that is, indeed, the API.<br>
> Why would we have the pointer going in by value, when it is coming out<br>
> as an OUT argument?<br>
> Isn't this plain wrong?  void **baseptr means ---> I am passing you the<br>
> address of a void pointer.<br>
> Every viable implementation must do *(void **)baseptr = ...<br>
> when providing the "malloc'd/special" memory.  So... why did we fudge<br>
> the C API.  Is there some tie-in with the Fortran API?<br>
> Thanks in advance,<br>
> Tony Skjellum<br>
> <br>
> <br>
> --<br>
> Anthony Skjellum, PhD<br>
> [ <a href="mailto:skjellum@gmail.com">mailto:skjellum@gmail.com</a> | skjellum@gmail.com ]<br>
> Cell: +1-205-807-4968<br>
> <br>
> <br>
> <br>
> _______________________________________________<br>
> mpi-forum mailing list<br>
> mpi-forum@lists.mpi-forum.org<br>
> <a href="https://lists.mpi-forum.org/mailman/listinfo/mpi-forum">https://lists.mpi-forum.org/mailman/listinfo/mpi-forum</a><br>
<br>
-- <br>
Dr. Rolf Rabenseifner . . . . . . . . . .. email rabenseifner@hlrs.de .<br>
High Performance Computing Center (HLRS) . phone ++49(0)711/685-65530 .<br>
University of Stuttgart . . . . . . . . .. fax ++49(0)711 / 685-65832 .<br>
Head of Dpmt Parallel Computing . . . <a href="http://www.hlrs.de/people/rabenseifner">
www.hlrs.de/people/rabenseifner</a> .<br>
Nobelstr. 19, D-70550 Stuttgart, Germany . . . . (Office: Room 1.307) .<br>
_______________________________________________<br>
mpi-forum mailing list<br>
mpi-forum@lists.mpi-forum.org<br>
<a href="https://lists.mpi-forum.org/mailman/listinfo/mpi-forum">https://lists.mpi-forum.org/mailman/listinfo/mpi-forum</a><br>
</div>
</span></font></div>
</body>
</html>