[Beowulf] Stroustrup regarding multicore

Michael H. Frese Michael.Frese at NumerEx-LLC.com
Tue Aug 26 15:13:09 PDT 2008


Perry,

My first comment had nothing to do with whether C's 2-d arrays are 
allocated contiguously in memory.  I assume that they are, as was 
implicit in my remark about "doing the stepping by hand."

My comment has to do with the assembly code that the C compiler 
generates to access an element of the array.  My much dog-eared 
edition of K&R (1978) -- with a fair bit of faded yellow 
highlighting, all mine, dating from 1983 -- says very clearly in the 
section "Multi-dimensional Arrays" that "by definition, a 
two-dimensional array is really a one-dimensional array, each of 
whose elements is an array."  Any compiler writer may thus choose to 
store the addresses of the beginnings of the rows of an array in a 
one-dimensional array, then recall and de-reference those pointers to 
get the values of the two-dimensional array.  In particular, this 
must be valid:

int a[9][9];
*(a[1]+3) = 7 ;

A C compiler must be perfectly happy to printf("a[1]=%d",a[1]), or 
for that matter (a[1])[3].  You may consider this an advantage.  I am 
not so sure.

I stipulate that the compiler writer MAY choose to compute a[1] -- a 
pointer to real -- every time it appears, but I doubt there's 
language in the standard that requires it, since only hardware 
characteristics say which is more efficient.

As for my final comment, Appendix A of K&R, "C Reference Manual" says 
clearly that the [ ] in the array declarator may be empty but if not 
it must contain a constant expression "whose value is determinable at 
compile time."  Clearly, one can not separately compile a function 
that uses multidimensional array syntax -- not pointer syntax -- to 
return a specified value of an arbitrarily dimensioned array.  That 
can be easily done in Fortran, since the array dimensions may be 
dummy arguments to the subroutines.  Recognizing them as variable 
array dimensions, the compiler sets aside memory locations for their 
values, and writes code to set those locations to the values pointed 
to by the dummy arguments on entry to the subroutine.  The Fortran 
standard requires this arcane behavior, because it prohibits the real 
dimensions from changing between entry and exit, though the reason 
for that is far from clear to me.  It's quite amusing really, that 
since the real array dimensions are decoupled from the dummy argument 
value, they are effectively called by value.

Regarding RGB's lengthy response, I agree whole-heartedly that C 
should not be expected to handle arrays perfectly, and that each 
language has its own field of best application, such as C++ to GUI's, 
C for system interfaces, and Fortran for array number crunching.  For 
such things wrappers are made.

Sorry for being so obtuse originally.


Mike


At 09:05 AM 8/26/2008, you wrote:

>"Michael H. Frese" <Michael.Frese at NumerEx-LLC.com> writes:
> > C is not much better.  I once worked a young computational programmer
> > for almost a week to get him to prove to himself that a C source
> > program couldn't walk through a 2-d array the hard way as fast as a
> > Fortran source program unless the stepping was coded by hand.
>
>I don't understand what that means. I've been programming in C for
>about 25 years, and I have known Fortran since the mid-1970s.
>
> > He didn't believe that a 2-d array in C is syntactically a 1-d array
> > of pointers to 1-d arrays,
>
>He was right. You are just plain wrong.
>
>char foo[10][10]
>
>allocates 100 consecutive addresses in memory.
>
>In case you don't believe me, try out the following program:
>
>----------------------------------------------------------------------
>#include <stdio.h>
>
>char foo[10][10];
>
>int main(int argc, char **argv)
>{
>         int i, j;
>
>         for (i = 0; i < 10; i++)
>                 for (j = 0; j < 10; j++)
>                         printf("%d\n", &(foo[i][j]));
>}
>----------------------------------------------------------------------
>
>It will print 100 consecutive integers, the addresses of the character
>array elements.
>
> > and the row pointers must be fetched from memory!
>
>I call bull. That's just totally false. You clearly don't know how C
>works.
>
> > And separate compilation of functions with variable array
> > dimensions?  I hear echoes of Kernighan and Ritchie laughing with each
> > other "We don't need no steenking libraries with execution-time array
> > dimensioning!  We're system programmers here!  Besides, if somebody
> > needs that they'll use Fortran."
>
>Er, you can do that, too. Works just fine. What *are* you talking
>about?
>
>Perry
>_______________________________________________
>Beowulf mailing list, Beowulf at beowulf.org
>To change your subscription (digest mode or unsubscribe) visit 
>http://www.beowulf.org/mailman/listinfo/beowulf
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.beowulf.org/pipermail/beowulf/attachments/20080826/24e07aff/attachment.html>


More information about the Beowulf mailing list