Skip to content

Instantly share code, notes, and snippets.

@samtkaplan
Last active December 19, 2015 17:28
Show Gist options
  • Save samtkaplan/5991236 to your computer and use it in GitHub Desktop.
Save samtkaplan/5991236 to your computer and use it in GitHub Desktop.
function laplace_idiomatic (del_x::Array{Float64, 3}, x::Array{Float64, 3})
n1, n2, n3 = size (x)
for i3 = 2:n3-1, i2 = 2:n2-1, i1 = 2:n1-1
del_x[i1,i2,i3] =
x[i1+1,i2,i3] + x[i1-1,i2,i3] +
x[i1,i2+1,i3] + x[i1,i2-1,i3] +
x[i1,i2,i3+1] + x[i1,i2,i3-1] -
6.0 * x[i1,i2,i3]
end
end
function laplace_inbounds (del_x::Array{Float64, 3}, x::Array{Float64, 3})
n1, n2, n3 = size (x)
@inbounds begin
for i3 = 2:n3-1, i2 = 2:n2-1, i1 = 2:n1-1
del_x[i1,i2,i3] =
x[i1+1,i2,i3] + x[i1-1,i2,i3] +
x[i1,i2+1,i3] + x[i1,i2-1,i3] +
x[i1,i2,i3+1] + x[i1,i2,i3-1] -
6.0 * x[i1,i2,i3]
end
end
end
function laplace_inbounds_linear (del_x::Array{Float64, 3}, x::Array{Float64, 3})
n1, n2, n3 = size(x)
@inbounds begin
for i3 = 2:n3-1, i2 = 2:n2-1, i1 = 2:n1-1
index1 = n1 * ((i3 - 1) * n2 + (i2 - 1)) + i1
index2 = n1 * ((i3 - 1) * n2 + (i2 - 1)) + i1 + 1
index3 = n1 * ((i3 - 1) * n2 + (i2 - 1)) + i1 - 1
index4 = n1 * ((i3 - 1) * n2 + (i2 - 2)) + i1
index5 = n1 * ((i3 - 1) * n2 + (i2 - 0)) + i1
index6 = n1 * ((i3 - 2) * n2 + (i2 - 1)) + i1
index7 = n1 * ((i3 - 0) * n2 + (i2 - 1)) + i1
del_x[index1] = x[index2] + x[index3] +
x[index4] + x[index5] +
x[index6] + x[index7] -
6.0 * x[index1]
end
end
end
require ("laplace.jl")
function main ()
niters = 10
n = 300
field = init_field (n)
del_field = zeros (size (field))
# warmup Julia
laplace_idiomatic (del_field, field)
laplace_inbounds (del_field, field)
laplace_inbounds_linear (del_field, field)
# timing idiomatic Julia version
tic ()
for n = 1:niters
laplace_idiomatic (del_field, field)
end
write (STDOUT, "Julia (idiomatic): ")
toc ()
# timing inbounds Julia version
tic ()
for n = 1:niters
laplace_inbounds (del_field, field)
end
write (STDOUT, "Julia (inbounds): ")
toc ()
# timing inbounds linear Julia version
tic ()
for n = 1:niters
laplace_inbounds_linear (del_field, field)
end
write (STDOUT, "Julia (inbounds, linear): ")
toc ()
end
function init_field (n::Int64)
field = zeros (n, n, n)
for i1 = 1:n, i2 = 1:n, i3 = 1:n
if i1 == 1 || i2 == 1 || i3 == 1 || i1 == n || i2 == n || i3 == n
field[i1,i2,i3] = 1.0
end
end
field
end
main ()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment