This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Re: Allocate a variable in a known physical location
- From: isuru herath <isuru81 at yahoo dot com>
- To: gcc-help at gcc dot gnu dot org
- Cc: Cenedese at indel dot ch
- Date: Tue, 1 Feb 2011 07:53:00 -0800 (PST)
- Subject: Re: Allocate a variable in a known physical location
Hi Fabi,
Thanks for the reply. I tried that, but still numbers don't change. Let me
describe the scenario.
My code without any modification I got 201557258 accesses. I needed to
allocate those i and j variables in a separate area of memory. To do that
I follow the method described earlier(using a structure). Therefore I got
accesses in that separate area. I got 100893832 accesses in that area, but
my total accesses are increased to 302450960. I thought this is because
every time I access variable i or j, I have to access poniter p first. No
I tried Fabi's suggestion. code shown below
int* p_i = &(p->i);
int* p_j = &(p->j);
int* p_k = &(p->k);
for (*p_k=0; *p_k < *p_mat_size; (*p_k)++)
...
...
Still I got total access as 302450960. Could somebody help me to
understand this.
Any help/advice is greatly appreciated.
regards,
Isuru
> Once you have p->i, you can also do int* pi=&(p->i);
> So *pi=1 will only be one access.
> bye Fabi
--- On Tue, 2/1/11, isuru herath <isuru81@yahoo.com> wrote:
> From: isuru herath <isuru81@yahoo.com>
> Subject: Re: Allocate a variable in a known physical location
> To: gcc-help@gcc.gnu.org
> Cc: david@westcontrol.com
> Date: Tuesday, February 1, 2011, 3:07 AM
> Hi David,
>
> Thanks a lot for the reply. The address 0x10001000 is a
> physical address
> and not a virtual address. I thought we can only do this
> type casting with
> virtual addresses. Anyway I tried the method you suggested
> and I got a
> segmentation fault.
>
> I use mmap to map those physical addresses to virtual
> addresses, because
> OS(linux) in unaware of this other piece of memory which
> uses physical
> address range 0x10001000 to 0x10101000.
>
> In my example, when I use my method to access i via pointer
> p (p->i), it
> first accesses p and then accesses i. But this introduces
> unnecessary
> access p. Therefore I was wondering how to allocate i in
> the above
> physical region.(Please note that I cant use any
> optimization -O2, -O3)
>
> I was looking in section attribute, but still couldn't
> figure out how to
> use it, also I am not sure it is the correct way to do
> this.
>
> any help/suggestion is greatly appreciated.
>
> regards,
> Isuru
>
> > I don't know what OS you are using, or what you want
> to do with mmap.
> > But if you have struct that you want to access at a
> particular address,
> > the easiest way is with a bit of typecasting:
>
> > struct my *p = (struct my*) 0x10001000;
>
> > Then when you access p->j, for example, the
> generated code will use the
> > absolute address 0x10001004 (for 32-bit ints).
>
> > mvh.,
>
> > David
>
> --- On Mon, 1/31/11, isuru herath <isuru81@yahoo.com>
> wrote:
>
> > From: isuru herath <isuru81@yahoo.com>
> > Subject: Re: Allocate a variable in a known physical
> location
> > To: "Ian Lance Taylor" <iant@google.com>
> > Cc: gcc-help@gcc.gnu.org
> > Date: Monday, January 31, 2011, 1:01 PM
> > Hi Ian,
> >
> > Thanks a lot for your quick response and I am sorry
> for not
> > explaining the
> > problem correctly.
> >
> > I have a separate piece of memory for which I have
> given
> > physical address
> > range 0x10001000 to 0x10101000. I want to allocate
> > variables in this
> > address range. To achieve this I create a structure
> with
> > variables I need
> > to allocate there. For example if I need to allocate i
> and
> > j in the above
> > address range, I define a structure like following.
> >
> > struct my
> > {
> > ? ???int i;
> > ? ???int j;
> > };
> >
> > and then allocate memory for the structure using mmap
> like
> > below.(bear with
> > me if syntax are wrong).
> >
> > struct my *p = mmap(........);
> >
> > when ever I need to access i, j in my code I access
> them
> > via pointer p like
> > following.
> >
> > p->i or p->j
> >
> > All what I need is to allocate i and j in the above
> address
> > range. Due to
> > lack of my? knowledge in compiler and gcc this is
> how
> > I did it. The
> > drawback of this is that to access i, it has to access
> p
> > first. This
> > introduces an unnecessary access to my statistics.
> > Therefore if I could
> > allocate i and j without using the above method I
> thought
> > my problem will
> > be solved.
> >
> > As you mentioned in your reply can I use section
> attribute
> > to achieve this or do you have any other suggestion.
> >
> > Any help/advice is greatly appreciated.
> >
> > regards,
> > Isuru
> >
> > --- On Mon, 1/31/11, Ian Lance Taylor <iant@google.com>
> > wrote:
> >
> > > From: Ian Lance Taylor <iant@google.com>
> > > Subject: Re: Allocate a variable in a known
> physical
> > location
> > > To: "isuru herath" <isuru81@yahoo.com>
> > > Cc: gcc-help@gcc.gnu.org
> > > Date: Monday, January 31, 2011, 11:21 AM
> > > isuru herath <isuru81@yahoo.com>
> > > writes:
> > >
> > > > I need to allocate a variable in a known
> > physical
> > > location, let's say I need
> > > > to allocate void *p in location
> 0x10001000.? I
> > > was using mmap to to do this,
> > > > but in that manner I can only allocate
> p[0],
> > > p[1]...p[n] in that physical
> > > > address range. Therefore when I access
> p[i],
> > accesses
> > > to p results in
> > > > outside {0x10001000,? 0x10001000+offset}
> and
> > p[i]
> > > results as an access in
> > > > the range I am interested in.
> > >
> > > I don't understand the last sentence there.
> > >
> > > > I was wondering is there a was for me to
> force
> > > > to allocate variable p in that address range
> or I
> > am
> > > looking for something
> > > > totally unrealistic. Because of the nature
> of my
> > > research I can use any
> > > > optimization(-O2, O3).
> > >
> > > If you don't want to use mmap, the simplest way
> to put
> > a
> > > variable at a
> > > specific location is to put it in a specific
> section
> > using
> > > __attribute__
> > > ((section ("..."))) and then put that section at
> a
> > specific
> > > address
> > > using a linker script.
> > >
> > > Ian
> > >
> >
> >
> >
> >
>
>
>
>