faster memset

Tim Prince TimothyPrince@sbcglobal.net
Mon May 26 23:26:00 GMT 2008


Tim Prince wrote:
> Eric Blake wrote:
>> Aaron J. Grier <aaron <at> frye.com> writes:
>>
>>> On Thu, May 22, 2008 at 04:56:54PM +0000, Eric Blake wrote:
>>>> My patched assembly is no longer sensitive to alignment, and always
>>>> gets the speed of 8-byte alignment.  This clinches it - for memset,
>>>> x86 assembly is noticeably faster than C.
>>> have you done comparisons with the builtin memset() in recent versions
>>> of gcc?
>>>
>>
>> I was testing with gcc 3.4.4, which does have __builtin_memset.  But 
>> my understanding is that __builtin_memset defers to the library 
>> function on cases it cannot optimize at compile time?  At any rate, my 
>> test app called the library function via a function pointer - does 
>> __builtin_memset even have an address to be used via a function pointer?
>>
>> If I understand it correctly, __builtin_memset(ptr,0,8) is a good 
>> example of where the compiler optimization helps (it is faster to 
>> open-code two 32-bit writes than to call a function), in which case 
>> that is faster than anything I can code in assembly.  But 
>> __builtin_memset(ptr,0,1000), even though 1000 is constant, starts to 
>> be such a large amount of open-coded assignments that the compiler 
>> probably falls back to the library routine anyway, probably trusting 
>> that the library knows more architecture tricks for efficiency than 
>> what you can represent generically in gcc's builtin definition table.  
>> Finally, __builtin_memset(ptr,0,len) cannot be optimized, since len is 
>> not known at compile time, so the compiler must fall back on the library.
>>
>> In other words, by comparing against __builtin_memset, wouldn't I 
>> merely be comparing against my own implementation for most of the 
>> interesting cases?
>>
> 
> gcc for i386 chooses the __builtin_memset where it recognizes 
> possibilities to optimize code size.  gcc x86_64 default configuration 
> calls the library function, except for those few cases such as you 
> mention where a small number of int operations is suitable.  Only 
> recently did glibc implement a memset() with good performance for long 
> strings, agreed upon by developers for both AMD and Intel.  So it would 
> be interesting to compare with that implementation.
I was thinking more of memcpy() here, sorry.  memset does have the quirk 
that it needs a strategy which switches to nontemporal store when the 
string length approaches some large fraction of cache size.



More information about the Newlib mailing list