On Mon, Feb 13, 2012 at 23:04, Steven Bosscher <stevenb....@gmail.com> wrote:
> On Mon, Feb 13, 2012 at 7:20 PM, Janne Blomqvist
> <blomqvist.ja...@gmail.com> wrote:
>> Hi,
>>
>> the attached patch changes the low-level libgfortran IO dispatching
>> mechanism to use shared vtables for each stream type, instead of all
>> the function pointers being replicated for each unit. This is similar
>> to e.g. how the C++ frontend implements vtables. The benefits are:
>>
>> - Slightly smaller heap memory overhead for each unit as only the
>> vtable pointer needs to be stored, and slightly faster unit
>> initialization as only the vtable pointer needs to be setup instead of
>> all the function pointers in the stream struct.
>>
>> - Looking at unix.o with readelf, one sees
>>
>> Relocation section '.rela.data.rel.ro.local.mem_vtable' at offset
>> 0x15550 contains 8 entries:
>>
>> and similarly for the other vtables; according to
>> http://www.airs.com/blog/archives/189 this means that after relocation
>> the page where this data resides may be marked read-only.
>>
>> The downside is that the sizes of the .text and .data sections are
>> increased. Before:
>>
>>   text    data     bss     dec     hex filename
>> 1116991    6664     592 1124247  112797
>> ./x86_64-unknown-linux-gnu/libgfortran/.libs/libgfortran.so
>>
>> After:
>>
>>   text    data     bss     dec     hex filename
>> 1117487    6936     592 1125015  112a97
>> ./x86_64-unknown-linux-gnu/libgfortran/.libs/libgfortran.so
>>
>>
>> The data section increase is due to the vtables, the text increase is,
>> I guess, due to the extra pointer dereference when calling the IO
>> functions.
>>
>> Regtested on x86_64-unknown-linux-gnu, Ok for trunk, or 4.8?
>
> Certainly not for trunk at this stage.

Fair enough.

> For 4.8: So the trade-off is between faster initialization and smaller
> heap vs. fewer pointer dereferences?

From a performance perspective, yes. Also, a multi-threaded program
may benefit slightly from fewer cacheline ping-pongs due to the
read-only vtables being separated from the RW data in the stream
struct. That being said, while there are a few performance issues
lurking here and there in libgfortran, virtual function dispatch isn't
one of them. I think you'd be hard pressed to come up with a benchmark
where you could see a difference.

The other advantage is that by putting the vtables in read-only pages,
the chance of a buggy program getting a SIGSEGV instead of corrupting
the library state is slightly increased.

> Does this patch fix an actual
> problem? Does it bring a killer feature?

No, it's certainly not a "killer feature". In general, considering the
maturity of gfortran, I think it's unreasonable to expect that a
bordering-on-trivial patch would bring a killer feature.

The patch came about as a small experiment I did, and as I considered
the result an overall improvement (even if admittedly quite a minor
one), I added a ChangeLog and submitted it.

-- 
Janne Blomqvist

Reply via email to