nbody_def.jl 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. #include("./nbody_display.jl")
  2. include("nbody.jl")
  3. 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)
  4. vert = StarpuDataFilter(STARPU_MATRIX_FILTER_VERTICAL_BLOCK, nslices)
  5. for i = 1:nbr_simulations
  6. @starpu_block let
  7. hPOS, hVEL, hACC, hPAR, hMA = starpu_data_register(positions,velocities,accelerations,parameters,masses)
  8. starpu_data_partition(hACC,vert)
  9. @starpu_sync_tasks for task in (1:nslices)
  10. @starpu_block let
  11. id = Int64[task-1]
  12. hID = starpu_data_register(id)
  13. @starpu_async_cl claccst(hPOS,hACC[task],hMA,hPAR,hID)
  14. end
  15. end
  16. starpu_data_partition(hPOS,vert)
  17. starpu_data_partition(hVEL,vert)
  18. @starpu_sync_tasks for task in (1:nslices)
  19. @starpu_async_cl clupdtst(hPOS[task],hVEL[task],hACC[task],hPAR)
  20. end
  21. end
  22. # pixels ::Array{Array{Int64}} = [[0,0,0] for i = 1:1000*1000]
  23. # graph_planets(pixels, positions, -4E8, 4E8, 1000, 1000, "PPM/nbody_st$(nbr_planets)_$i.ppm")
  24. end
  25. return nothing
  26. end
  27. 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)
  28. vert = StarpuDataFilter(STARPU_MATRIX_FILTER_VERTICAL_BLOCK, nslices)
  29. for i = 1:nbr_simulations
  30. @starpu_block let
  31. hPOS, hVEL, hACC, hPAR, hMA = starpu_data_register(positions,velocities,accelerations,parameters,masses)
  32. starpu_data_partition(hACC,vert)
  33. @starpu_sync_tasks for task in (1:nslices)
  34. id = Int64[task-1]
  35. hID = starpu_data_register(id)
  36. @starpu_async_cl clacccpu(hPOS,hACC[task],hMA,hPAR,hID)
  37. end
  38. starpu_data_partition(hPOS,vert)
  39. starpu_data_partition(hVEL,vert)
  40. @starpu_sync_tasks for task in (1:nslices)
  41. @starpu_async_cl clupdtcpu(hPOS[task],hVEL[task],hACC[task],hPAR)
  42. end
  43. end
  44. # pixels ::Array{Array{Int64}} = [[0,0,0] for i = 1:1000*1000]
  45. # graph_planets(pixels, positions, -4E8, 4E8, 1000, 1000, "PPM/nbody_cpu$i.ppm")
  46. end
  47. return nothing
  48. end
  49. 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)
  50. vert = StarpuDataFilter(STARPU_MATRIX_FILTER_VERTICAL_BLOCK, nslices)
  51. for i = 1:nbr_simulations
  52. @starpu_block let
  53. hPOS, hVEL, hACC, hPAR, hMA = starpu_data_register(positions,velocities,accelerations,parameters,masses)
  54. starpu_data_partition(hACC,vert)
  55. @starpu_sync_tasks for task in (1:nslices)
  56. id = Int64[task-1]
  57. hID = starpu_data_register(id)
  58. @starpu_async_cl claccgpu(hPOS,hACC[task],hMA,hPAR,hID)
  59. end
  60. starpu_data_partition(hPOS,vert)
  61. starpu_data_partition(hVEL,vert)
  62. @starpu_sync_tasks for task in (1:nslices)
  63. @starpu_async_cl clupdtgpu(hPOS[task],hVEL[task],hACC[task],hPAR)
  64. end
  65. end
  66. # pixels ::Array{Array{Int64}} = [[0,0,0] for i = 1:1000*1000]
  67. # graph_planets(pixels, positions, -4E8, 4E8, 1000, 1000, "PPM/nbody_gpu$i.ppm")
  68. end
  69. return nothing
  70. end
  71. # function display_times(starting_nbr_planets::Int64, step_nbr ::Int64, nbr_steps ::Int64, nbr_simulations::Int64, nb_tests ::Int64, nslices::Int64)
  72. # width = 1000
  73. # height = 1000
  74. # times_starpu ::Vector{Float64} = [0 for i = 1:nbr_steps+1]
  75. # times_julia ::Vector{Float64} = [0 for i = 1:nbr_steps+1]
  76. # for k = 0:nbr_steps
  77. # nbr_planets ::Int64 = starting_nbr_planets + k * step_nbr
  78. # println("Number of planets: $nbr_planets")
  79. # epsilon ::Float64 = 2.5E8
  80. # dt ::Float64 = 36000
  81. # G ::Float64 = 6.67408E-11
  82. # parameters ::Vector{Float64} = [G,dt,epsilon]
  83. # maxcoord ::Int64 = 2E8
  84. # mincoord ::Int64 = -2E8
  85. # positions ::Matrix{Float64} = zeros(2, nbr_planets)
  86. # velocities ::Matrix{Float64} = zeros(2, nbr_planets)
  87. # accelerations ::Matrix{Float64} = zeros(2,nbr_planets)
  88. # positionsjl ::Vector{Vector{Float64}} = [[0, 0] for i = 1:nbr_planets]
  89. # velocitiesjl ::Vector{Vector{Float64}} = [[0, 0] for i = 1:nbr_planets]
  90. # accelerationsjl ::Vector{Vector{Float64}} = [[0, 0] for i = 1:nbr_planets]
  91. # masses ::Vector{Float64} = [0 for i = 1:nbr_planets]
  92. # for i = 1:nbr_planets
  93. # mi ::Float64 = rand() * 5E22
  94. # ri = mi * 2.5E-15
  95. # angle ::Float64 = rand() * 2 * pi
  96. # distToCenter ::Float64 = rand() * 1.0E8 + 1.0E8
  97. # qix ::Float64 = cos(angle) * distToCenter
  98. # qiy ::Float64 = sin(angle) * distToCenter
  99. # vix ::Float64 = qiy * 4.0E-6
  100. # viy ::Float64 = -qix * 4.0E-6
  101. # masses[i] = mi
  102. # positions[1,i] = qix
  103. # positions[2,i] = qiy
  104. # positionsjl[i] = [qix, qiy]
  105. # velocities[1,i] = vix
  106. # velocities[2,i] = viy
  107. # velocitiesjl[i] = [vix, viy]
  108. # end
  109. # max_value = 4E8
  110. # min_value = -4E8
  111. # println("Starpu...")
  112. # tic()
  113. # for i = 1:nbr_simulations
  114. # nbody_with_starpu(positions, velocities, accelerations, masses, parameters, nslices)
  115. # end
  116. # t_starpu = toq()
  117. # println("No Starpu...")
  118. # tic()
  119. # for i = 1:nbr_simulations
  120. # nbody_jl(positionsjl, velocitiesjl, accelerationsjl, masses, epsilon, dt)
  121. # end
  122. # t_julia = toq()
  123. # times_starpu[k+1] = t_starpu
  124. # times_julia[k+1] = t_julia
  125. # end
  126. # open("./DAT/nbody.dat", "w") do f
  127. # for i = 0:nbr_steps
  128. # write(f, "$(starting_nbr_planets + i*step_nbr)")
  129. # write(f, " $(times_starpu[i+1])")
  130. # write(f, " $(times_julia[i+1])\n")
  131. # end
  132. # end
  133. # end
  134. function set_to_zero(A ::Array{<:Real,2})
  135. height,width = size(A)
  136. for i = 1:height
  137. for j = 1:width
  138. A[i,j] = 0
  139. end
  140. end
  141. end
  142. function median_times(nbr_tests ::Int64, nbr_planets ::Int64, nbr_simulations ::Int64, nslices ::Int64)
  143. ######################### INITIALIZATION #########################
  144. width ::Int64 = 1000
  145. height ::Int64 = 1000
  146. epsilon ::Float64 = 2.5E8
  147. dt ::Float64 = 3600
  148. G ::Float64 = 6.67408E-11
  149. parameters ::Vector{Float64} = [G,dt,epsilon]
  150. # Coordinate interval for the final display screen.
  151. maxcoord ::Int64 = 2E8
  152. mincoord ::Int64 = -2E8
  153. exec_times_st ::Vector{Float64} = [0 for i = 1:nbr_tests]
  154. exec_times_cpu ::Vector{Float64} = [0 for i = 1:nbr_tests]
  155. exec_times_gpu ::Vector{Float64} = [0 for i = 1:nbr_tests]
  156. # exec_times_jl ::Vector{Float64} = [0 for i = 1:nbr_tests]
  157. # Arrays used for each of the starpu-using functions.
  158. positions ::Matrix{Float64} = zeros(2, nbr_planets)
  159. velocities ::Matrix{Float64} = zeros(2, nbr_planets)
  160. accelerations_st ::Matrix{Float64} = zeros(2, nbr_planets)
  161. # Arrays used for the naive julia function.
  162. # positions_jl ::Vector{Vector{Float64}} = [[0, 0] for i = 1:nbr_planets]
  163. # velocities_jl ::Vector{Vector{Float64}} = [[0, 0] for i = 1:nbr_planets]
  164. # accelerations_jl ::Vector{Vector{Float64}} = [[0, 0] for i = 1:nbr_planets]
  165. masses ::Vector{Float64} = [0 for i = 1:nbr_planets]
  166. for k = 1:nbr_tests
  167. println("Test $k...")
  168. # Initializing the starpu and naive julia arrays with the same values.
  169. for i = 1:nbr_planets
  170. mi ::Float64 = rand() * 5E22
  171. ri = mi * 2.5E-15
  172. angle ::Float64 = rand() * 2 * pi
  173. distToCenter ::Float64 = rand() * 1.0E8 + 1.0E8
  174. qix ::Float64 = cos(angle) * distToCenter
  175. qiy ::Float64 = sin(angle) * distToCenter
  176. vix ::Float64 = qiy * 4.0E-6
  177. viy ::Float64 = -qix * 4.0E-6
  178. masses[i] = mi
  179. positions[1,i] = qix
  180. positions[2,i] = qiy
  181. #positions_jl[i] = [qix, qiy]
  182. velocities[1,i] = vix
  183. velocities[2,i] = viy
  184. #velocities_jl[i] = [vix, viy]
  185. end
  186. ######################### SIMULATION #########################
  187. # Using new arrays for the starpu functions, so we can keep in memory the initial values.
  188. positions_st ::Matrix{Float64} = copy(positions)
  189. velocities_st ::Matrix{Float64} = copy(velocities)
  190. set_to_zero(accelerations_st)
  191. tic()
  192. nbody_with_starpu(positions_st, velocities_st, accelerations_st, masses, parameters, nbr_simulations, nslices, nbr_planets)
  193. t_st = toq()
  194. # positions_st = copy(positions)
  195. # velocities_st = copy(velocities)
  196. # set_to_zero(accelerations_st)
  197. # tic()
  198. # nbody_with_starpu_cpu(positions_st, velocities_st, accelerations_st, masses, parameters, nbr_simulations, nslices)
  199. # t_cpu = toq()
  200. # positions_st = copy(positions)
  201. # velocities_st = copy(velocities)
  202. # set_to_zero(accelerations_st)
  203. # tic()
  204. # nbody_with_starpu_gpu(positions_st, velocities_st, accelerations_st, masses, parameters, nbr_simulations, nslices)
  205. # t_gpu = toq()
  206. #tic()
  207. #nbody_jl(positions_jl, velocities_jl, accelerations_jl, masses, nbr_simulations, epsilon, dt)
  208. #t_jl = toq()
  209. exec_times_st[k] = t_st
  210. # exec_times_cpu[k] = t_cpu
  211. # exec_times_gpu[k] = t_gpu
  212. #exec_times_jl[k] = t_jl
  213. end
  214. sort!(exec_times_st)
  215. # sort!(exec_times_cpu)
  216. # sort!(exec_times_gpu)
  217. #sort!(exec_times_jl)
  218. 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)]]
  219. return res
  220. end
  221. # Adds the median times of each function inside a .DAT file.
  222. function display_times(start_nbr ::Int64, step_nbr ::Int64, stop_nbr ::Int64, nbr_simulations ::Int64, nslices ::Int64, nbr_tests ::Int64)
  223. # mtc = map( (x->parse(Float64,x)), open("DAT/nbody_c_times.dat") do f
  224. # readlines(f)
  225. # end)
  226. mtjl = map( (x->parse(Float64,x)), open("../DAT/nbody_jl.dat") do f
  227. readlines(f)
  228. end)
  229. mtcstr = map( (x->parse(Float64,x)), open("../DAT/nbody_c_struct_times.dat") do f
  230. readlines(f)
  231. end)
  232. mtcarr = map( (x->parse(Float64,x)), open("../DAT/nbody_c_array_times.dat") do f
  233. readlines(f)
  234. end)
  235. i = 1;
  236. #open("./DAT/nbody_jl.dat", "w") do fjl
  237. open("../DAT/nbody_jl_array_times.dat", "w") do ft
  238. open("../DAT/nbody_speedups.dat", "w") do f
  239. for nbr_planets in (start_nbr : step_nbr : stop_nbr)
  240. println("$(nbr_planets) planets:")
  241. mt ::Vector{Float64} = median_times(nbr_tests, nbr_planets, nbr_simulations, nslices)
  242. println("C struct time: $(mtcstr[i])")
  243. println("C array time: $(mtcarr[i])")
  244. println("Starpujl time: $(mt[1])")
  245. # println("CPUjl time: $(mt[2])")
  246. # println("GPUjl time: $(mt[3])")
  247. println("Julia time: $(mtjl[i])")
  248. write(f, "$(nbr_planets) $(mtjl[i]/mt[1]) $(mtjl[i]/mtcstr[i]) $(mtjl[i]/mtcarr[i])\n")
  249. write(ft, "$(mt[1])\n")
  250. #write(fjl, "$(mt[4])\n")
  251. i = i + 1
  252. end
  253. end
  254. end
  255. #end
  256. end