| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381 | 
							- # StarPU --- Runtime system for heterogeneous multicore architectures.
 
- #
 
- # Copyright (C) 2020       Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria
 
- #
 
- # StarPU is free software; you can redistribute it and/or modify
 
- # it under the terms of the GNU Lesser General Public License as published by
 
- # the Free Software Foundation; either version 2.1 of the License, or (at
 
- # your option) any later version.
 
- #
 
- # StarPU is distributed in the hope that it will be useful, but
 
- # WITHOUT ANY WARRANTY; without even the implied warranty of
 
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
- #
 
- # See the GNU Lesser General Public License in COPYING.LGPL for more details.
 
- #
 
- #include("./nbody_display.jl")
 
- include("nbody.jl")
 
- function nbody_with_starpu(positions ::Matrix{Float64}, velocities ::Matrix{Float64}, accelerations ::Matrix{Float64}, masses ::Vector{Float64}, parameters ::Vector{Float64}, nbr_simulations ::Int64, nslices ::Int64, nbr_planets ::Int64)
 
-     
 
-     vert = StarpuDataFilter(STARPU_MATRIX_FILTER_VERTICAL_BLOCK, nslices)
 
-     for i = 1:nbr_simulations
 
-  
 
-         @starpu_block let
 
-             hPOS, hVEL, hACC, hPAR, hMA = starpu_data_register(positions,velocities,accelerations,parameters,masses)
 
-             
 
-             starpu_data_partition(hACC,vert)
 
-             @starpu_sync_tasks for task in (1:nslices)
 
-                 @starpu_block let
 
-                     id = Int64[task-1]
 
-                     hID = starpu_data_register(id)
 
-                     @starpu_async_cl claccst(hPOS,hACC[task],hMA,hPAR,hID)
 
-                 end
 
-             end
 
-             
 
-             starpu_data_partition(hPOS,vert)
 
-             starpu_data_partition(hVEL,vert)
 
-             
 
-             @starpu_sync_tasks for task in (1:nslices)
 
-                 @starpu_async_cl clupdtst(hPOS[task],hVEL[task],hACC[task],hPAR)
 
-             end
 
-             
 
-         end
 
-         # pixels ::Array{Array{Int64}} = [[0,0,0] for i = 1:1000*1000]
 
-         # graph_planets(pixels, positions, -4E8, 4E8, 1000, 1000, "PPM/nbody_st$(nbr_planets)_$i.ppm")
 
-     end
 
-     return nothing
 
- end
 
- function nbody_with_starpu_cpu(positions ::Matrix{Float64}, velocities ::Matrix{Float64}, accelerations ::Matrix{Float64}, masses ::Vector{Float64}, parameters ::Vector{Float64}, nbr_simulations ::Int64, nslices ::Int64)
 
-     vert = StarpuDataFilter(STARPU_MATRIX_FILTER_VERTICAL_BLOCK, nslices)
 
-  
 
-     for i = 1:nbr_simulations
 
-         @starpu_block let
 
-             hPOS, hVEL, hACC, hPAR, hMA = starpu_data_register(positions,velocities,accelerations,parameters,masses)
 
-             
 
-             starpu_data_partition(hACC,vert)
 
-             @starpu_sync_tasks for task in (1:nslices)
 
-                 id = Int64[task-1]
 
-                 hID = starpu_data_register(id)
 
-                 @starpu_async_cl clacccpu(hPOS,hACC[task],hMA,hPAR,hID)
 
-             end
 
-             
 
-             starpu_data_partition(hPOS,vert)
 
-             starpu_data_partition(hVEL,vert)
 
-             
 
-             @starpu_sync_tasks for task in (1:nslices)
 
-                 @starpu_async_cl clupdtcpu(hPOS[task],hVEL[task],hACC[task],hPAR)
 
-             end
 
-             
 
-         end
 
-         
 
-         # pixels ::Array{Array{Int64}} = [[0,0,0] for i = 1:1000*1000]
 
-         # graph_planets(pixels, positions, -4E8, 4E8, 1000, 1000, "PPM/nbody_cpu$i.ppm")
 
-     end
 
-     return nothing
 
- end
 
- function nbody_with_starpu_gpu(positions ::Matrix{Float64}, velocities ::Matrix{Float64}, accelerations ::Matrix{Float64}, masses ::Vector{Float64}, parameters ::Vector{Float64}, nbr_simulations ::Int64, nslices ::Int64)
 
-     vert = StarpuDataFilter(STARPU_MATRIX_FILTER_VERTICAL_BLOCK, nslices)
 
-     for i = 1:nbr_simulations
 
-         @starpu_block let
 
-             hPOS, hVEL, hACC, hPAR, hMA = starpu_data_register(positions,velocities,accelerations,parameters,masses)
 
-             
 
-             starpu_data_partition(hACC,vert)
 
-             @starpu_sync_tasks for task in (1:nslices)
 
-                 id = Int64[task-1]
 
-                 hID = starpu_data_register(id)
 
-                 @starpu_async_cl claccgpu(hPOS,hACC[task],hMA,hPAR,hID)
 
-             end
 
-             
 
-             starpu_data_partition(hPOS,vert)
 
-             starpu_data_partition(hVEL,vert)
 
-             
 
-             @starpu_sync_tasks for task in (1:nslices)
 
-                 @starpu_async_cl clupdtgpu(hPOS[task],hVEL[task],hACC[task],hPAR)
 
-             end
 
-         end       
 
-     
 
-         # pixels ::Array{Array{Int64}} = [[0,0,0] for i = 1:1000*1000]
 
-         # graph_planets(pixels, positions, -4E8, 4E8, 1000, 1000, "PPM/nbody_gpu$i.ppm")
 
-     end
 
-     return nothing
 
- end
 
- # function display_times(starting_nbr_planets::Int64, step_nbr ::Int64, nbr_steps ::Int64, nbr_simulations::Int64, nb_tests ::Int64, nslices::Int64)
 
- #     width = 1000
 
- #     height = 1000
 
- #     times_starpu ::Vector{Float64} = [0 for i = 1:nbr_steps+1]
 
- #     times_julia ::Vector{Float64} = [0 for i = 1:nbr_steps+1]
 
-     
 
- #     for k = 0:nbr_steps
 
- #         nbr_planets ::Int64 = starting_nbr_planets + k * step_nbr
 
- #         println("Number of planets: $nbr_planets")
 
- #         epsilon ::Float64 = 2.5E8
 
- #         dt ::Float64 = 36000
 
- #         G ::Float64 = 6.67408E-11
 
- #         parameters ::Vector{Float64} = [G,dt,epsilon]
 
-         
 
- #         maxcoord ::Int64 = 2E8
 
- #         mincoord ::Int64 = -2E8
 
-         
 
- #         positions ::Matrix{Float64} = zeros(2, nbr_planets)
 
- #         velocities ::Matrix{Float64} = zeros(2, nbr_planets)
 
- #         accelerations ::Matrix{Float64} = zeros(2,nbr_planets)
 
-         
 
- #         positionsjl ::Vector{Vector{Float64}} = [[0, 0] for i = 1:nbr_planets]
 
- #         velocitiesjl ::Vector{Vector{Float64}} = [[0, 0] for i = 1:nbr_planets]
 
- #         accelerationsjl ::Vector{Vector{Float64}} = [[0, 0] for i = 1:nbr_planets]
 
-         
 
-         
 
- #         masses ::Vector{Float64} = [0 for i = 1:nbr_planets]
 
-         
 
-         
 
-         
 
- #         for i = 1:nbr_planets
 
- #             mi ::Float64 = rand() * 5E22
 
- #             ri = mi * 2.5E-15
 
-             
 
- #             angle ::Float64 = rand() * 2 * pi
 
- #             distToCenter ::Float64 = rand() * 1.0E8 + 1.0E8
 
-             
 
- #             qix ::Float64 = cos(angle) * distToCenter
 
- #             qiy ::Float64 = sin(angle) * distToCenter
 
-             
 
- #             vix ::Float64 = qiy * 4.0E-6
 
- #             viy ::Float64 = -qix * 4.0E-6
 
-             
 
- #             masses[i] = mi
 
-         
 
- #             positions[1,i] = qix
 
- #             positions[2,i] = qiy
 
-             
 
- #             positionsjl[i] = [qix, qiy]
 
-             
 
- #             velocities[1,i] = vix
 
- #             velocities[2,i] = viy
 
-             
 
- #             velocitiesjl[i] = [vix, viy]
 
- #         end
 
-         
 
- #         max_value = 4E8
 
- #         min_value = -4E8
 
-         
 
- #         println("Starpu...")
 
- #         tic()
 
- #         for i = 1:nbr_simulations
 
- #             nbody_with_starpu(positions, velocities, accelerations, masses, parameters, nslices)
 
- #         end
 
- #         t_starpu = toq()
 
-         
 
- #         println("No Starpu...")
 
- #         tic()
 
- #         for i = 1:nbr_simulations
 
- #             nbody_jl(positionsjl, velocitiesjl, accelerationsjl, masses, epsilon, dt)
 
- #         end
 
- #         t_julia = toq()
 
-         
 
-         
 
-         
 
- #         times_starpu[k+1] = t_starpu
 
- #         times_julia[k+1] = t_julia
 
- #     end
 
- #     open("./DAT/nbody.dat", "w") do f
 
- #         for i = 0:nbr_steps
 
- #             write(f, "$(starting_nbr_planets + i*step_nbr)")
 
- #             write(f, " $(times_starpu[i+1])")
 
- #             write(f, " $(times_julia[i+1])\n")
 
- #         end
 
- #     end
 
- # end
 
- function set_to_zero(A ::Array{<:Real,2})
 
-     height,width = size(A)
 
-     for i = 1:height
 
-         for j = 1:width
 
-             A[i,j] = 0
 
-         end
 
-     end
 
- end
 
- function median_times(nbr_tests ::Int64, nbr_planets ::Int64, nbr_simulations ::Int64, nslices ::Int64)
 
- ######################### INITIALIZATION #########################
 
-     width ::Int64 = 1000
 
-     height ::Int64 = 1000
 
-     epsilon ::Float64 = 2.5E8
 
-     dt ::Float64 = 3600
 
-     G ::Float64 = 6.67408E-11
 
-     parameters ::Vector{Float64} = [G,dt,epsilon]
 
-     # Coordinate interval for the final display screen.
 
-     maxcoord ::Int64 = 2E8
 
-     mincoord ::Int64 = -2E8
 
-     exec_times_st ::Vector{Float64} = [0 for i = 1:nbr_tests]
 
-     exec_times_cpu ::Vector{Float64} = [0 for i = 1:nbr_tests]
 
-     exec_times_gpu ::Vector{Float64} = [0 for i = 1:nbr_tests]
 
-     # exec_times_jl ::Vector{Float64} = [0 for i = 1:nbr_tests]
 
-     # Arrays used for each of the starpu-using functions. 
 
-     positions ::Matrix{Float64} = zeros(2, nbr_planets)
 
-     velocities ::Matrix{Float64} = zeros(2, nbr_planets)
 
-     accelerations_st ::Matrix{Float64} = zeros(2, nbr_planets)    
 
-     
 
-     # Arrays used for the naive julia function.
 
-     # positions_jl ::Vector{Vector{Float64}} = [[0, 0] for i = 1:nbr_planets]
 
-     # velocities_jl ::Vector{Vector{Float64}} = [[0, 0] for i = 1:nbr_planets]
 
-     # accelerations_jl ::Vector{Vector{Float64}} = [[0, 0] for i = 1:nbr_planets]
 
-     
 
-     
 
-     masses ::Vector{Float64} = [0 for i = 1:nbr_planets]
 
-     
 
-     for k = 1:nbr_tests
 
-         println("Test $k...")
 
-         # Initializing the starpu and naive julia arrays with the same values.
 
-         for i = 1:nbr_planets
 
-             mi ::Float64 = rand() * 5E22
 
-             ri = mi * 2.5E-15
 
-             
 
-             angle ::Float64 = rand() * 2 * pi
 
-             distToCenter ::Float64 = rand() * 1.0E8 + 1.0E8
 
-             
 
-             qix ::Float64 = cos(angle) * distToCenter
 
-             qiy ::Float64 = sin(angle) * distToCenter
 
-             
 
-             vix ::Float64 = qiy * 4.0E-6
 
-             viy ::Float64 = -qix * 4.0E-6
 
-             
 
-             masses[i] = mi
 
-             
 
-             positions[1,i] = qix
 
-             positions[2,i] = qiy
 
-             
 
-             #positions_jl[i] = [qix, qiy]
 
-             
 
-             velocities[1,i] = vix
 
-             velocities[2,i] = viy
 
-             
 
-             #velocities_jl[i] = [vix, viy]
 
-         end
 
- ######################### SIMULATION #########################
 
-         # Using new arrays for the starpu functions, so we can keep in memory the initial values.
 
-         positions_st ::Matrix{Float64} = copy(positions)
 
-         velocities_st ::Matrix{Float64} = copy(velocities)
 
-         set_to_zero(accelerations_st)
 
-         tic()
 
-         nbody_with_starpu(positions_st, velocities_st, accelerations_st, masses, parameters, nbr_simulations, nslices, nbr_planets)
 
-         t_st = toq()
 
-         # positions_st = copy(positions)
 
-         # velocities_st = copy(velocities)
 
-         # set_to_zero(accelerations_st)
 
-                 
 
-         # tic()
 
-         # nbody_with_starpu_cpu(positions_st, velocities_st, accelerations_st, masses, parameters, nbr_simulations, nslices)
 
-         # t_cpu = toq()
 
-         
 
-         # positions_st = copy(positions)
 
-         # velocities_st = copy(velocities)
 
-         # set_to_zero(accelerations_st)
 
-         # tic()
 
-         # nbody_with_starpu_gpu(positions_st, velocities_st, accelerations_st, masses, parameters, nbr_simulations, nslices)
 
-         # t_gpu = toq()
 
-         
 
-         #tic()
 
-         #nbody_jl(positions_jl, velocities_jl, accelerations_jl, masses, nbr_simulations, epsilon, dt)
 
-         #t_jl = toq()
 
-         
 
-         exec_times_st[k] = t_st
 
-         # exec_times_cpu[k] = t_cpu
 
-         # exec_times_gpu[k] = t_gpu
 
-         #exec_times_jl[k] = t_jl
 
-         
 
-     end
 
-     sort!(exec_times_st)
 
-     # sort!(exec_times_cpu)
 
-     # sort!(exec_times_gpu)
 
-     #sort!(exec_times_jl)
 
-     res ::Vector{Float64} = [exec_times_st[1 + div(nbr_tests-1,2)]]#, exec_times_cpu[1 + div(nbr_tests-1,2)], exec_times_gpu[1 + div(nbr_tests-1,2)]]#, exec_times_jl[1 + div(nbr_tests-1,2)]]
 
-     
 
-     return res
 
- end
 
- # Adds the median times of each function inside a .DAT file.
 
- function display_times(start_nbr ::Int64, step_nbr ::Int64, stop_nbr ::Int64, nbr_simulations ::Int64, nslices ::Int64, nbr_tests ::Int64)
 
-     # mtc = map( (x->parse(Float64,x)), open("DAT/nbody_c_times.dat") do f
 
-     #         readlines(f)
 
-     #         end)
 
-     mtjl = map( (x->parse(Float64,x)), open("../DAT/nbody_jl.dat") do f
 
-             readlines(f)
 
-             end)
 
-     mtcstr = map( (x->parse(Float64,x)), open("../DAT/nbody_c_struct_times.dat") do f
 
-                   readlines(f)
 
-                   end)
 
-     mtcarr = map( (x->parse(Float64,x)), open("../DAT/nbody_c_array_times.dat") do f
 
-                   readlines(f)
 
-                   end)
 
-     i = 1;
 
-     #open("./DAT/nbody_jl.dat", "w") do fjl
 
-     open("../DAT/nbody_jl_array_times.dat", "w") do ft
 
-         open("../DAT/nbody_speedups.dat", "w") do f
 
-             for nbr_planets in (start_nbr : step_nbr : stop_nbr)
 
-                 println("$(nbr_planets) planets:")
 
-                 mt ::Vector{Float64} = median_times(nbr_tests, nbr_planets, nbr_simulations, nslices)
 
-                 println("C struct time: $(mtcstr[i])")
 
-                 println("C array time: $(mtcarr[i])")
 
-                 println("Starpujl time: $(mt[1])")
 
-                 # println("CPUjl time: $(mt[2])")
 
-                 # println("GPUjl time: $(mt[3])")
 
-                 println("Julia time: $(mtjl[i])")
 
-                 write(f, "$(nbr_planets) $(mtjl[i]/mt[1]) $(mtjl[i]/mtcstr[i]) $(mtjl[i]/mtcarr[i])\n") 
 
-                 write(ft, "$(mt[1])\n")
 
-                 #write(fjl, "$(mt[4])\n")
 
-                 i = i + 1
 
-                 
 
-             end
 
-         end
 
-     end
 
-     #end
 
- end
 
-         
 
 
  |