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


So you are counting the number of dereferences/loads?

What optimization level are you using?  Depending on your code, you
may also need to specify that these addresses cannot alias one
another, as the potentially aliasing variables may require more loads,
depending on how you use the pointers.

Is this for an experiment, or for real usable code?

  Brian

On Tue, Feb 1, 2011 at 7:53 AM, isuru herath <isuru81@yahoo.com> wrote:
> 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]