Hello everyone,

I want to do n-body simulations with Julia. The number of particles is 
small (10 to 100) but the simulation runs for tens of millions of orbits 
and I want to optimize them. The most natural way to implement this is to 
have one array for every particle property:

x = Array(Float64,nbodies) # x coordinates
y = Array(Float64,nbodies) # y coordinates
z = Array(Float64,nbodies) # z coordinates
u = Array(Float64,nbodies) # u coordinates
v = Array(Float64,nbodies) # v coordinates
w = Array(Float64,nbodies) # w coordinates
m = Array(Float64,nbodies) # m coordinates


That means that when I compute the force between two particles I need to 
access 7 x 2 = 14 values that are not sequential in memory. So I was 
thinking that it might be worth making a new type:

type TBody
    x::TFloat
    y::TFloat
    z::TFloat
    u::TFloat
    v::TFloat
    w::TFloat
    m::TFloat
end
bodies = Array(TBody,nbodies)

So, when I compute the force between two particles, I should only need to 
access two bits of memory. But on the other hand, maybe this is all a waste 
of time. With only 100 particles, and 7 doubles per particle, the entire 
memory cost is about 5 kb and it all fits easily inside the CPU's L1 cache. 
So maybe this is just a classical example of premature optimization that 
has no value whatsoever.

Can anyone give me an opinion here? Is there something I haven't thought of?

Cheers,
Daniel.

Reply via email to