Matrix mul

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Sun Nov 23 13:11:32 PST 2008


Tom S wrote:
> Andrei Alexandrescu wrote:
>> Tom S wrote:
>>> Don wrote:
>>>> bearophile wrote:
>>>>> While writing code that works on matrices I have found something 
>>>>> curious...
>>>>
>>>> Here's what I think is going on. AFAIK, D hasn't got any special 
>>>> code for initializing jagged arrays. So
>>>>         auto A = new double[][](N, N);
>>>> involves N+1 memory allocations.
>>>> As well as being slow, this is going to give horrible locality of 
>>>> reference in the memory allocation. You'll suffer cache misses on 
>>>> almost every array access!
>>>>
>>>> I don't think this has anything to do with bounds checking.
>>>
>>> Nah, it's about NaNs :)
>>>
>>> Version #1 initializes C to NaN, Version #2 initializes it to 0. The 
>>> 'init mats randomly' loop doesn't touch C at all, thus all the latter 
>>> additions leave C at NaN, causing lots of FP exceptions.
>>>
>>> We actually had something like this happen in Deadlock a few times in 
>>> the animation subsystem. Brought the framerate down to a single digit :D
>>
>> I swear I wrote my previous message before reading this :o). Damn 
>> you're right. I hadn't seen the bug in initialization. But since 
>> version #2 uses malloc, isn't that memory garbage (possibly, but not 
>> necessarily, zero)?
> 
> Damn, you're right too ;) I always forget whether malloc or calloc 
> initializes to zero. According to my tests, DMD/Tango's malloc returns 
> mostly zeroes in bearophile's test anyway.

In my experience malloc returns zeroed memory around the start of an 
application (due to the OS applying simple security considerations). 
Later on, as memory is reused, there's no more zeroes - it's whatever 
you left in there.

Andrei



More information about the Digitalmars-d mailing list