This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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
> > > 
> > 
> > 
> > 
> > 
> 
> 
> 
> 




Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]