forked from JuliaLang/julia
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathplife.jl
70 lines (63 loc) · 2.08 KB
/
plife.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
function life_rule(old)
m, n = size(old)
new = similar(old, m-2, n-2)
for j = 2:n-1
for i = 2:m-1
nc = +(old[i-1,j-1], old[i-1,j], old[i-1,j+1],
old[i ,j-1], old[i ,j+1],
old[i+1,j-1], old[i+1,j], old[i+1,j+1])
new[i-1,j-1] = (nc == 3 ? 1 :
nc == 2 ? old[i,j] :
0)
end
end
new
end
function life_step(d)
DArray(size(d),procs(d)) do I
# fetch neighborhood - toroidal boundaries
top = mod(first(I[1])-2,size(d,1))+1
bot = mod( last(I[1]) ,size(d,1))+1
left = mod(first(I[2])-2,size(d,2))+1
right = mod( last(I[2]) ,size(d,2))+1
old = Array(Bool, length(I[1])+2, length(I[2])+2)
@sync begin
@async old[1 , 1 ] = d[top , left] # left side
@async old[2:end-1, 1 ] = d[I[1], left]
@async old[end , 1 ] = d[bot , left]
@async old[1 , 2:end-1] = d[top , I[2]]
@async old[2:end-1, 2:end-1] = d[I[1], I[2]] # middle
@async old[end , 2:end-1] = d[bot , I[2]]
@async old[1 , end ] = d[top , right] # right side
@async old[2:end-1, end ] = d[I[1], right]
@async old[end , end ] = d[bot , right]
end
life_rule(old)
end
end
function plife(m, n)
w = Window("parallel life", n, m)
c = Canvas(w)
pack(c)
done = false
c.mouse.button1press = (c,x,y)->(done=true)
cr = getgc(c)
grid = DArray(I->convert(Array{Bool,2},randbool(map(length,I))), (m, n), workers())
last = time(); f = 1
while !done
@async begin
img = convert(Array{Uint32,2},grid) .* 0x00ffffff
set_source_surface(cr, CairoRGBSurface(img), 0, 0)
paint(cr)
reveal(c)
end
t = time()
if t-last > 2
println("$(f/(t-last)) FPS")
last = t; f = 0
end
grid = life_step(grid)
f += 1
sleep(0.01)
end
end