<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.5.7654.12">
<TITLE>RE: [Cbe-oss-dev] Memalign and free doesn't work</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/plain format -->

<P><FONT SIZE=2>Phil,<BR>
<BR>
If you're trying to program the Cell's SPEs, I would suggest using the functions malloc_align() and free_align().&nbsp; You'll have to include the headers &lt;spu_intrinsics.h&gt; and &lt;libmisc.h&gt; for them to work.&nbsp; Take a look at the description of malloc_align() below that I copied directly from the comment block in the malloc_align.h file.<BR>
<BR>
/* Function<BR>
&nbsp;*<BR>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void * malloc_align(size_t size, unsigned int log2_align)<BR>
&nbsp;*<BR>
&nbsp;* Description<BR>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The malloc_align routine allocates a memory buffer of &lt;size&gt;<BR>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bytes aligned to the power of 2 alignment specified by &lt;log2_align&gt;.<BR>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For example, malloc_align(4096, 7) will allocate a memory heap<BR>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer of 4096 bytes aligned on a 128 byte boundary.<BR>
&nbsp;*<BR>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The aligned malloc routine allocates an enlarged buffer<BR>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from the standard memory heap. Space for the real allocated memory<BR>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pointer is reserved on the front of the memory buffer.<BR>
&nbsp;*<BR>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ----------------- &lt;--- start of allocated memory<BR>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; pad 0 to&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<BR>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |(1&lt;&lt;log2_align)-1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<BR>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; bytes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<BR>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |-----------------|<BR>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | allocation size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<BR>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |-----------------|<BR>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | real buffer ptr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<BR>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |-----------------|&lt;---- returned aligned memory pointer<BR>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<BR>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; requested&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<BR>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; memory&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<BR>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; buffer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<BR>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<BR>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bytes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<BR>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |______________________|<BR>
&nbsp;*<BR>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Memory allocated by this routine must be freed using the free_align<BR>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; routine.<BR>
&nbsp;*<BR>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The size of the allocation is saved for special cases where the<BR>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data must be mored during a realloc_align.<BR>
&nbsp;*/<BR>
<BR>
Also, please notice that this function does not take the alignment size in bytes as the argument directly.&nbsp; Rather, it takes in an integer power of a base-two number system.&nbsp; So, for an alignment of 16, you would use 4, since 2^4 is 16.&nbsp; For 128 you would use 7, since 2^7 is 128, and so on.<BR>
<BR>
In addition, as the diagram above shows, the function does allocate a bit more memory than requested.&nbsp; The space required has to do with the extra information it stores.&nbsp; It's primarily used in case the realloc_align() function is called.&nbsp; Either way, just don't be surprised if you have a little more memory allocated than anticipated.&nbsp; This also answers your original question for memalign allocating 68848 bytes.<BR>
<BR>
My source code follows below.&nbsp; I have included the Makefile used.&nbsp; Copy the text labelled Makefile to a file called, well... you guessed it, &quot;Makefile&quot;.&nbsp; Also, create a C file called &quot;spu_mem.c&quot; in the same directory, and copy my source code into it.&nbsp; Now, just run the command &quot;make &lt;ENTER&gt;&quot; from the command line and it should build the program &quot;spu_mem&quot; that you can run directly.<BR>
<BR>
code: Makefile<BR>
============================================<BR>
PROGRAM_spu := spu_mem<BR>
IMPORTS = -lmisc<BR>
include /opt/cell/sdk/buildutils/make.footer<BR>
============================================<BR>
<BR>
code: spu_mem.c<BR>
============================================<BR>
#include &lt;stdio.h&gt;<BR>
#include &lt;spu_intrinsics.h&gt;<BR>
#include &lt;libmisc.h&gt;<BR>
<BR>
// Register 1 in SPU provides difference between heap and stack pointers<BR>
// Heap pointer not provided in SPU, but stack pointer is in first element<BR>
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; of Register 1, and difference between heap and stack is in second<BR>
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element of Register 1.<BR>
// Set reg_1 equal to Register 1.<BR>
register volatile vector unsigned int reg_1 asm(&quot;1&quot;);<BR>
<BR>
int main(unsigned long long spe_id, unsigned long long<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; program_data_ea, unsigned long long env)<BR>
{<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int before_alloc, after_alloc;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void *triangles_local_mem;<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Print differences in stack and heap BEFORE memory allocation.<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // First, extract second element from Register 1, then print it.<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; before_alloc = spu_extract(reg_1, 1);<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;Before malloc_align allocation: stack - heap = %#x\n&quot;,<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; before_alloc);<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Allocate roughly 64k of space in SPU using malloc_align.<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; triangles_local_mem = (void *)malloc_align(65536, 4);<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Print differences in stack and heap AFTER memory allocation.<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // First, extract second element from Register 1, then print it.<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; after_alloc = spu_extract(reg_1, 1);<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;After malloc_align allocation: stack - heap = %#x\n&quot;,<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; after_alloc);<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Show the difference in space available in memory.<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;Space allocated by malloc_align: %d bytes\n&quot;,<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; before_alloc - after_alloc);<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Free allocated memory in SPU using free_align.<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free_align(triangles_local_mem);<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<BR>
}<BR>
============================================<BR>
<BR>
The full sequence of commands to compile and run the program, plus the output from the spulet above follow:<BR>
<BR>
[user@ps3 spu]# ls<BR>
Makefile&nbsp; spu_mem.c<BR>
<BR>
[user@ps3 spu]# make<BR>
/usr/bin/ccache /usr/bin/spu-gcc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -W -Wall -Winline&nbsp; -I.&nbsp; -I /opt/cell/sdk/usr/spu/include&nbsp; -O3 -c spu_mem.c<BR>
spu_mem.c: In function 'main':<BR>
spu_mem.c:12: warning: unused parameter 'spe_id'<BR>
spu_mem.c:13: warning: unused parameter 'program_data_ea'<BR>
spu_mem.c:13: warning: unused parameter 'env'<BR>
/usr/bin/ccache /usr/bin/spu-gcc -o spu_mem&nbsp; spu_mem.o&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -L/opt/cell/sdk/usr/spu/lib -Wl,-N&nbsp;&nbsp; -lmisc<BR>
/usr/bin/ppu-embedspu -m32 spu_mem spu_mem spu_mem-embed.o<BR>
/usr/bin/ppu-ar -qcs spu_mem.a spu_mem-embed.o<BR>
<BR>
[user@ps3 spu]# ./spu_mem<BR>
Before malloc_align allocation: stack - heap = 0x3e5d0<BR>
After malloc_align allocation: stack - heap = 0x2e3b0<BR>
Space allocated by malloc_align: 66080 bytes<BR>
<BR>
As you can see above, the function malloc_align() actually allocated 66080 instead of the 65536 expected.&nbsp; The difference is due to that bit of extra information it also stores in the process, as we discussed previously.<BR>
<BR>
A great resource in case you're learning to program for the Cell B.E. is Matthew Scarpino's book &quot;Programming the Cell Processor: For Games, Graphics, and Computation.&quot;<BR>
<BR>
I hope this helps,<BR>
Gunnar<BR>
<BR>
-----Original Message-----<BR>
From: cbe-oss-dev-bounces+vikbergg=msoe.edu@lists.ozlabs.org on behalf of Phil Pratt-Szeliga<BR>
Sent: Sun 10/11/09 9:18<BR>
To: W<BR>
Cc: cbe-oss-dev@lists.ozlabs.org<BR>
Subject: Re: [Cbe-oss-dev] Memalign and free doesn't work<BR>
<BR>
Well this is causing me to run out of memory.&nbsp; Isn't this wrong in<BR>
standard unix then too?<BR>
<BR>
Phil<BR>
<BR>
On Sun, Oct 11, 2009 at 2:36 AM, W &lt;w.l.fischer@googlemail.com&gt; wrote:<BR>
&gt; Hi Phillip,<BR>
&gt;<BR>
&gt; nearly the same on standard linux:<BR>
&gt;<BR>
&gt; $ ./a.out<BR>
&gt; MemUsage: 0<BR>
&gt; MemUsage: 135168<BR>
&gt; $ uname -a<BR>
&gt; Linux z4 2.6.26-1-686 #1 SMP Fri Mar 13 18:08:45 UTC 2009 i686 GNU/Linux<BR>
&gt;<BR>
&gt; Willem<BR>
&gt;<BR>
&gt; On Sat, Oct 10, 2009 at 3:13 PM, Philip Pratt-Szeliga<BR>
&gt; &lt;phil.pratt.szeliga@gmail.com&gt; wrote:<BR>
&gt;&gt; Hello,<BR>
&gt;&gt;<BR>
&gt;&gt; I am noticing that memalign and free doesn't work on the ps3.<BR>
&gt;&gt;<BR>
&gt;&gt; code:<BR>
&gt;&gt; =======================<BR>
&gt;&gt; #include &lt;malloc.h&gt;<BR>
&gt;&gt;<BR>
&gt;&gt; static void printMemUsage()<BR>
&gt;&gt; {<BR>
&gt;&gt;  struct mallinfo mi;<BR>
&gt;&gt;  mi = mallinfo();<BR>
&gt;&gt;  printf(&quot;MemUsage: %d\n&quot;, mi.arena);<BR>
&gt;&gt; }<BR>
&gt;&gt;<BR>
&gt;&gt; int main(unsigned long long spe_id, unsigned long long<BR>
&gt;&gt; program_data_ea, unsigned long long env)<BR>
&gt;&gt; {<BR>
&gt;&gt;  printMemUsage();<BR>
&gt;&gt;  void * triangles_local_mem = memalign(16, 65535);<BR>
&gt;&gt;  free(triangles_local_mem);<BR>
&gt;&gt;  printMemUsage();<BR>
&gt;&gt;  return 0;<BR>
&gt;&gt; }<BR>
&gt;&gt; =======================<BR>
&gt;&gt;<BR>
&gt;&gt; compile:<BR>
&gt;&gt; spu-gcc cell_function.c<BR>
&gt;&gt;<BR>
&gt;&gt; results:<BR>
&gt;&gt; #./a.out<BR>
&gt;&gt; MemUsage: 0<BR>
&gt;&gt; MemUsage: 68848<BR>
&gt;&gt; #<BR>
&gt;&gt;<BR>
&gt;&gt; Am I doing something wrong?<BR>
&gt;&gt;<BR>
&gt;&gt; -Phil<BR>
&gt;&gt; _______________________________________________<BR>
&gt;&gt; cbe-oss-dev mailing list<BR>
&gt;&gt; cbe-oss-dev@lists.ozlabs.org<BR>
&gt;&gt; <A HREF="https://lists.ozlabs.org/listinfo/cbe-oss-dev">https://lists.ozlabs.org/listinfo/cbe-oss-dev</A><BR>
&gt;&gt;<BR>
&gt;<BR>
_______________________________________________<BR>
cbe-oss-dev mailing list<BR>
cbe-oss-dev@lists.ozlabs.org<BR>
<A HREF="https://lists.ozlabs.org/listinfo/cbe-oss-dev">https://lists.ozlabs.org/listinfo/cbe-oss-dev</A><BR>
<BR>
<BR>
<BR>
</FONT>
</P>

</BODY>
</HTML>