From c139b82fffb2a72198d63e6cc70dae8623658ec2 Mon Sep 17 00:00:00 2001 From: fpacaud Date: Fri, 4 Jun 2021 11:19:10 -0500 Subject: [PATCH 1/5] add Manifest.toml for reproductability --- Manifest.toml | 325 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 325 insertions(+) create mode 100644 Manifest.toml diff --git a/Manifest.toml b/Manifest.toml new file mode 100644 index 0000000..de87d5b --- /dev/null +++ b/Manifest.toml @@ -0,0 +1,325 @@ +# This file is machine-generated - editing it directly is not advised + +[[AbstractFFTs]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "485ee0867925449198280d4af84bdb46a2a404d0" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.0.1" + +[[Adapt]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "84918055d15b3114ede17ac6a7182f68870c16f7" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "3.3.1" + +[[ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" + +[[Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[BFloat16s]] +deps = ["LinearAlgebra", "Test"] +git-tree-sha1 = "4af69e205efc343068dc8722b8dfec1ade89254a" +uuid = "ab4f0b2a-ad5b-11e8-123f-65d77653426b" +version = "0.1.0" + +[[Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[BenchmarkTools]] +deps = ["JSON", "Logging", "Printf", "Statistics", "UUIDs"] +git-tree-sha1 = "01ca3823217f474243cc2c8e6e1d1f45956fe872" +uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +version = "1.0.0" + +[[CEnum]] +git-tree-sha1 = "215a9aa4a1f23fbd05b92769fdd62559488d70e9" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.4.1" + +[[CUDA]] +deps = ["AbstractFFTs", "Adapt", "BFloat16s", "CEnum", "CompilerSupportLibraries_jll", "DataStructures", "ExprTools", "GPUArrays", "GPUCompiler", "LLVM", "LazyArtifacts", "Libdl", "LinearAlgebra", "Logging", "MacroTools", "Memoize", "NNlib", "Printf", "Random", "Reexport", "Requires", "SparseArrays", "Statistics", "TimerOutputs"] +git-tree-sha1 = "2d90e6c29706856928f02e11ae15e71889905e34" +uuid = "052768ef-5323-5732-b1bb-66c8b64840ba" +version = "2.6.1" + +[[ChainRulesCore]] +deps = ["Compat", "LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "5d64be50ea9b43a89b476be773e125cef03c7cd5" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "0.10.1" + +[[Compat]] +deps = ["Base64", "Dates", "DelimitedFiles", "Distributed", "InteractiveUtils", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "Pkg", "Printf", "REPL", "Random", "SHA", "Serialization", "SharedArrays", "Sockets", "SparseArrays", "Statistics", "Test", "UUIDs", "Unicode"] +git-tree-sha1 = "e4e2b39db08f967cc1360951f01e8a75ec441cab" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "3.30.0" + +[[CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" + +[[DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "4437b64df1e0adccc3e5d1adbc3ac741095e4677" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.9" + +[[Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[DelimitedFiles]] +deps = ["Mmap"] +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" + +[[Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[DocStringExtensions]] +deps = ["LibGit2", "Markdown", "Pkg", "Test"] +git-tree-sha1 = "9d4f64f79012636741cf01133158a54b24924c32" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.8.4" + +[[Downloads]] +deps = ["ArgTools", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" + +[[ExprTools]] +git-tree-sha1 = "10407a39b87f29d47ebaca8edbc75d7c302ff93e" +uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" +version = "0.1.3" + +[[GPUArrays]] +deps = ["AbstractFFTs", "Adapt", "LinearAlgebra", "Printf", "Random", "Serialization", "Statistics"] +git-tree-sha1 = "df5b8569904c5c10e84c640984cfff054b18c086" +uuid = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7" +version = "6.4.1" + +[[GPUCompiler]] +deps = ["DataStructures", "ExprTools", "InteractiveUtils", "LLVM", "Libdl", "Logging", "Scratch", "Serialization", "TimerOutputs", "UUIDs"] +git-tree-sha1 = "ef2839b063e158672583b9c09d2cf4876a8d3d55" +uuid = "61eb1bfa-7361-4325-ad38-22787b887f55" +version = "0.10.0" + +[[InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[JLLWrappers]] +deps = ["Preferences"] +git-tree-sha1 = "642a199af8b68253517b80bd3bfd17eb4e84df6e" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.3.0" + +[[JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "81690084b6198a2e1da36fcfda16eeca9f9f24e4" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.1" + +[[LLVM]] +deps = ["CEnum", "Libdl", "Printf", "Unicode"] +git-tree-sha1 = "b499c68a45249b0385585c62f4a9b62b5db8e691" +uuid = "929cbde3-209d-540e-8aea-75f648917ca0" +version = "3.7.1" + +[[LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" + +[[LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" + +[[LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" + +[[LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" + +[[Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[LinearAlgebra]] +deps = ["Libdl"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[MPI]] +deps = ["Distributed", "DocStringExtensions", "Libdl", "MPICH_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "Pkg", "Random", "Requires", "Serialization", "Sockets"] +git-tree-sha1 = "c6490dd65713ade59594223f3d498feef7b08f44" +uuid = "da04e1cc-30fd-572f-bb4f-1f8673147195" +version = "0.17.1" + +[[MPICH_jll]] +deps = ["CompilerSupportLibraries_jll", "Libdl", "Pkg"] +git-tree-sha1 = "4d37f1e07b4e2a74462eebf9ee48c626d15ffdac" +uuid = "7cb0a576-ebde-5e09-9194-50597f1243b4" +version = "3.3.2+10" + +[[MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "6a8a2a625ab0dea913aba95c11370589e0239ff0" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.6" + +[[Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" + +[[Memoize]] +deps = ["MacroTools"] +git-tree-sha1 = "2b1dfcba103de714d31c033b5dacc2e4a12c7caa" +uuid = "c03570c3-d221-55d1-a50c-7939bbd78826" +version = "0.4.4" + +[[MicrosoftMPI_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e5c90234b3967684c9c6f87b4a54549b4ce21836" +uuid = "9237b28f-5490-5468-be7b-bb81f5f5e6cf" +version = "10.1.3+0" + +[[Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" + +[[NNlib]] +deps = ["Adapt", "ChainRulesCore", "Compat", "LinearAlgebra", "Pkg", "Requires", "Statistics"] +git-tree-sha1 = "0bf1fbb9dc557f2af9fb7e1337366d69de0dc78c" +uuid = "872c559c-99b0-510c-b3b7-b6c96a88d5cd" +version = "0.7.21" + +[[NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" + +[[OpenMPI_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4a3c5819d496790e8cd664045c7fbe295ff6ae07" +uuid = "fe0851c0-eecd-5654-98d4-656369965a5c" +version = "4.1.1+0" + +[[OrderedCollections]] +git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.4.1" + +[[Parsers]] +deps = ["Dates"] +git-tree-sha1 = "c8abc88faa3f7a3950832ac5d6e690881590d6dc" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "1.1.0" + +[[Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" + +[[Preferences]] +deps = ["TOML"] +git-tree-sha1 = "00cfd92944ca9c760982747e9a1d0d5d86ab1e5a" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.2.2" + +[[Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[Random]] +deps = ["Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[Reexport]] +git-tree-sha1 = "57d8440b0c7d98fc4f889e478e80f268d534c9d5" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.0.0" + +[[Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "4036a3bd08ac7e968e27c203d45f5fff15020621" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.1.3" + +[[SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" + +[[Scratch]] +deps = ["Dates"] +git-tree-sha1 = "ad4b278adb62d185bbcb6864dc24959ab0627bf6" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.0.3" + +[[Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" + +[[Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" + +[[Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[TimerOutputs]] +deps = ["ExprTools", "Printf"] +git-tree-sha1 = "bf8aacc899a1bd16522d0350e1e2310510d77236" +uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" +version = "0.5.9" + +[[UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" + +[[nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" + +[[p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" From 4bb2609aae78c47dbe431637feaee2d88068a0f3 Mon Sep 17 00:00:00 2001 From: Youngdae Kim Date: Fri, 4 Jun 2021 17:30:57 -0400 Subject: [PATCH 2/5] scripts to reproduce experiments. --- Manifest.toml | 583 +++++++++++++++++++++++++++++++++++++++++ Project.toml | 1 + figure5.sh | 31 +++ figure6.sh | 35 +++ figure7.sh | 21 ++ figure8.sh | 31 +++ launch_mpi.jl | 19 -- src/acopf_admm_gpu.jl | 424 ++++++++++++++++++++++++++++-- src/admm_standalone.jl | 4 +- src/heatmap.jl | 24 ++ src/launch_mpi.jl | 30 +++ src/load_imbalance.jl | 17 ++ src/opfdata.jl | 3 +- src/polar_kernel.jl | 4 +- table5.sh | 14 + 15 files changed, 1196 insertions(+), 45 deletions(-) create mode 100755 figure5.sh create mode 100755 figure6.sh create mode 100755 figure7.sh create mode 100755 figure8.sh delete mode 100644 launch_mpi.jl create mode 100644 src/heatmap.jl create mode 100644 src/launch_mpi.jl create mode 100644 src/load_imbalance.jl create mode 100755 table5.sh diff --git a/Manifest.toml b/Manifest.toml index de87d5b..5d8eac7 100644 --- a/Manifest.toml +++ b/Manifest.toml @@ -33,6 +33,12 @@ git-tree-sha1 = "01ca3823217f474243cc2c8e6e1d1f45956fe872" uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" version = "1.0.0" +[[Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "c3598e525718abcc440f69cc6d5f60dda0a1b61e" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.6+5" + [[CEnum]] git-tree-sha1 = "215a9aa4a1f23fbd05b92769fdd62559488d70e9" uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" @@ -44,12 +50,36 @@ git-tree-sha1 = "2d90e6c29706856928f02e11ae15e71889905e34" uuid = "052768ef-5323-5732-b1bb-66c8b64840ba" version = "2.6.1" +[[Cairo_jll]] +deps = ["Artifacts", "Bzip2_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "e2f47f6d8337369411569fd45ae5753ca10394c6" +uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" +version = "1.16.0+6" + [[ChainRulesCore]] deps = ["Compat", "LinearAlgebra", "SparseArrays"] git-tree-sha1 = "5d64be50ea9b43a89b476be773e125cef03c7cd5" uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" version = "0.10.1" +[[ColorSchemes]] +deps = ["ColorTypes", "Colors", "FixedPointNumbers", "Random", "StaticArrays"] +git-tree-sha1 = "c8fd01e4b736013bc61b704871d20503b33ea402" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.12.1" + +[[ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "024fe24d83e4a5bf5fc80501a314ce0d1aa35597" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.0" + +[[Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "417b0ed7b8b838aa6ca0a87aadf1bb9eb111ce40" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.8" + [[Compat]] deps = ["Base64", "Dates", "DelimitedFiles", "Distributed", "InteractiveUtils", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "Pkg", "Printf", "REPL", "Random", "SHA", "Serialization", "SharedArrays", "Sockets", "SparseArrays", "Statistics", "Test", "UUIDs", "Unicode"] git-tree-sha1 = "e4e2b39db08f967cc1360951f01e8a75ec441cab" @@ -60,12 +90,28 @@ version = "3.30.0" deps = ["Artifacts", "Libdl"] uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +[[Contour]] +deps = ["StaticArrays"] +git-tree-sha1 = "9f02045d934dc030edad45944ea80dbd1f0ebea7" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.5.7" + +[[DataAPI]] +git-tree-sha1 = "dfb3b7e89e395be1e25c2ad6d7690dc29cc53b1d" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.6.0" + [[DataStructures]] deps = ["Compat", "InteractiveUtils", "OrderedCollections"] git-tree-sha1 = "4437b64df1e0adccc3e5d1adbc3ac741095e4677" uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" version = "0.18.9" +[[DataValueInterfaces]] +git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" +uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" +version = "1.0.0" + [[Dates]] deps = ["Printf"] uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" @@ -88,11 +134,71 @@ version = "0.8.4" deps = ["ArgTools", "LibCURL", "NetworkOptions"] uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +[[EarCut_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "92d8f9f208637e8d2d28c664051a00569c01493d" +uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5" +version = "2.1.5+1" + +[[Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b3bfd02e98aedfa5cf885665493c5598c350cd2f" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.2.10+0" + [[ExprTools]] git-tree-sha1 = "10407a39b87f29d47ebaca8edbc75d7c302ff93e" uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" version = "0.1.3" +[[FFMPEG]] +deps = ["FFMPEG_jll"] +git-tree-sha1 = "b57e3acbe22f8484b4b5ff66a7499717fe1a9cc8" +uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" +version = "0.4.1" + +[[FFMPEG_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "LibVPX_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "Pkg", "Zlib_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "3cc57ad0a213808473eafef4845a74766242e05f" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.3.1+4" + +[[FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "35895cf184ceaab11fd778b4590144034a167a2f" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.13.1+14" + +[[Formatting]] +deps = ["Printf"] +git-tree-sha1 = "8339d61043228fdd3eb658d86c926cb282ae72a8" +uuid = "59287772-0a20-5a39-b81b-1366585eb4c0" +version = "0.4.2" + +[[FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "cbd58c9deb1d304f5a245a0b7eb841a2560cfec6" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.10.1+5" + +[[FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "aa31987c2ba8704e23c6c8ba8a4f769d5d7e4f91" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.10+0" + +[[GLFW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pkg", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] +git-tree-sha1 = "dba1e8614e98949abfa60480b13653813d8f0157" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.3.5+0" + [[GPUArrays]] deps = ["AbstractFFTs", "Adapt", "LinearAlgebra", "Printf", "Random", "Serialization", "Statistics"] git-tree-sha1 = "df5b8569904c5c10e84c640984cfff054b18c086" @@ -105,10 +211,67 @@ git-tree-sha1 = "ef2839b063e158672583b9c09d2cf4876a8d3d55" uuid = "61eb1bfa-7361-4325-ad38-22787b887f55" version = "0.10.0" +[[GR]] +deps = ["Base64", "DelimitedFiles", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Pkg", "Printf", "Random", "Serialization", "Sockets", "Test", "UUIDs"] +git-tree-sha1 = "b83e3125048a9c3158cbb7ca423790c7b1b57bea" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.57.5" + +[[GR_jll]] +deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Pkg", "Qt5Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "e14907859a1d3aee73a019e7b3c98e9e7b8b5b3e" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.57.3+0" + +[[GeometryBasics]] +deps = ["EarCut_jll", "IterTools", "LinearAlgebra", "StaticArrays", "StructArrays", "Tables"] +git-tree-sha1 = "4136b8a5668341e58398bb472754bff4ba0456ff" +uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326" +version = "0.3.12" + +[[Gettext_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" +uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" +version = "0.21.0+0" + +[[Glib_jll]] +deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "47ce50b742921377301e15005c96e979574e130b" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.68.1+0" + +[[Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[HTTP]] +deps = ["Base64", "Dates", "IniFile", "MbedTLS", "NetworkOptions", "Sockets", "URIs"] +git-tree-sha1 = "86ed84701fbfd1142c9786f8e53c595ff5a4def9" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "0.9.10" + +[[IniFile]] +deps = ["Test"] +git-tree-sha1 = "098e4d2c533924c921f9f9847274f2ad89e018b8" +uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f" +version = "0.5.0" + [[InteractiveUtils]] deps = ["Markdown"] uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" +[[IterTools]] +git-tree-sha1 = "05110a2ab1fc5f932622ffea2a003221f4782c18" +uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" +version = "1.3.0" + +[[IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + [[JLLWrappers]] deps = ["Preferences"] git-tree-sha1 = "642a199af8b68253517b80bd3bfd17eb4e84df6e" @@ -121,12 +284,41 @@ git-tree-sha1 = "81690084b6198a2e1da36fcfda16eeca9f9f24e4" uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" version = "0.21.1" +[[JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "d735490ac75c5cb9f1b00d8b5509c11984dc6943" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "2.1.0+0" + +[[LAME_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "f6250b16881adf048549549fba48b1161acdac8c" +uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" +version = "3.100.1+0" + [[LLVM]] deps = ["CEnum", "Libdl", "Printf", "Unicode"] git-tree-sha1 = "b499c68a45249b0385585c62f4a9b62b5db8e691" uuid = "929cbde3-209d-540e-8aea-75f648917ca0" version = "3.7.1" +[[LZO_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e5b909bcf985c5e2605737d2ce278ed791b89be6" +uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" +version = "2.10.1+0" + +[[LaTeXStrings]] +git-tree-sha1 = "c7f1c695e06c01b95a67f0cd1d34994f3e7db104" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.2.1" + +[[Latexify]] +deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "Printf", "Requires"] +git-tree-sha1 = "a4b12a1bd2ebade87891ab7e36fdbce582301a92" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.15.6" + [[LazyArtifacts]] deps = ["Artifacts", "Pkg"] uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" @@ -147,9 +339,63 @@ uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" deps = ["Artifacts", "Libdl", "MbedTLS_jll"] uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +[[LibVPX_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "12ee7e23fa4d18361e7c2cde8f8337d4c3101bc7" +uuid = "dd192d2f-8180-539f-9fb4-cc70b1dcf69a" +version = "1.10.0+0" + [[Libdl]] uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" +[[Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "761a393aeccd6aa92ec3515e428c26bf99575b3b" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.2.2+0" + +[[Libgcrypt_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll", "Pkg"] +git-tree-sha1 = "64613c82a59c120435c067c2b809fc61cf5166ae" +uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" +version = "1.8.7+0" + +[[Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "7739f837d6447403596a75d19ed01fd08d6f56bf" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.3.0+3" + +[[Libgpg_error_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "c333716e46366857753e273ce6a69ee0945a6db9" +uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" +version = "1.42.0+0" + +[[Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "8d22e127ea9a0917bc98ebd3755c8bd31989381e" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.16.1+0" + +[[Libmount_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "9c30530bf0effd46e15e0fdcf2b8636e78cbbd73" +uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" +version = "2.35.0+0" + +[[Libtiff_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Pkg", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "340e257aada13f95f98ee352d316c3bed37c8ab9" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.3.0+0" + +[[Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "7f3efec06033682db852f8b3bc3c1d2b0a0ab066" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.36.0+0" + [[LinearAlgebra]] deps = ["Libdl"] uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" @@ -179,10 +425,21 @@ version = "0.5.6" deps = ["Base64"] uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" +[[MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "Random", "Sockets"] +git-tree-sha1 = "1c38e51c3d08ef2278062ebceade0e46cefc96fe" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.0.3" + [[MbedTLS_jll]] deps = ["Artifacts", "Libdl"] uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +[[Measures]] +git-tree-sha1 = "e498ddeee6f9fdb4551ce855a46f54dbd900245f" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.1" + [[Memoize]] deps = ["MacroTools"] git-tree-sha1 = "2b1dfcba103de714d31c033b5dacc2e4a12c7caa" @@ -195,6 +452,12 @@ git-tree-sha1 = "e5c90234b3967684c9c6f87b4a54549b4ce21836" uuid = "9237b28f-5490-5468-be7b-bb81f5f5e6cf" version = "10.1.3+0" +[[Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "4ea90bd5d3985ae1f9a908bd4500ae88921c5ce7" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.0.0" + [[Mmap]] uuid = "a63ad114-7e13-5084-954f-fe012c677804" @@ -207,30 +470,83 @@ git-tree-sha1 = "0bf1fbb9dc557f2af9fb7e1337366d69de0dc78c" uuid = "872c559c-99b0-510c-b3b7-b6c96a88d5cd" version = "0.7.21" +[[NaNMath]] +git-tree-sha1 = "bfe47e760d60b82b66b61d2d44128b62e3a369fb" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "0.3.5" + [[NetworkOptions]] uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +[[Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "7937eda4681660b4d6aeeecc2f7e1c81c8ee4e2f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+0" + [[OpenMPI_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "4a3c5819d496790e8cd664045c7fbe295ff6ae07" uuid = "fe0851c0-eecd-5654-98d4-656369965a5c" version = "4.1.1+0" +[[OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "15003dcb7d8db3c6c857fda14891a539a8f2705a" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "1.1.10+0" + +[[Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.3.2+0" + [[OrderedCollections]] git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" version = "1.4.1" +[[PCRE_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b2a7af664e098055a7529ad1a900ded962bca488" +uuid = "2f80f16e-611a-54ab-bc61-aa92de5b98fc" +version = "8.44.0+0" + [[Parsers]] deps = ["Dates"] git-tree-sha1 = "c8abc88faa3f7a3950832ac5d6e690881590d6dc" uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" version = "1.1.0" +[[Pixman_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b4f5d02549a10e20780a24fce72bea96b6329e29" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.40.1+0" + [[Pkg]] deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +[[PlotThemes]] +deps = ["PlotUtils", "Requires", "Statistics"] +git-tree-sha1 = "a3a964ce9dc7898193536002a6dd892b1b5a6f1d" +uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" +version = "2.0.1" + +[[PlotUtils]] +deps = ["ColorSchemes", "Colors", "Dates", "Printf", "Random", "Reexport", "Statistics"] +git-tree-sha1 = "ae9a295ac761f64d8c2ec7f9f24d21eb4ffba34d" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.0.10" + +[[Plots]] +deps = ["Base64", "Contour", "Dates", "FFMPEG", "FixedPointNumbers", "GR", "GeometryBasics", "JSON", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "PlotThemes", "PlotUtils", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "UUIDs"] +git-tree-sha1 = "27cf598536826c3b3538b60241bfd39c73796005" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.16.2" + [[Preferences]] deps = ["TOML"] git-tree-sha1 = "00cfd92944ca9c760982747e9a1d0d5d86ab1e5a" @@ -241,6 +557,12 @@ version = "1.2.2" deps = ["Unicode"] uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" +[[Qt5Base_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "xkbcommon_jll"] +git-tree-sha1 = "ad368663a5e20dbb8d6dc2fddeefe4dae0781ae8" +uuid = "ea2cea3b-5b76-57ae-a6ef-0a8af62496e1" +version = "5.15.3+0" + [[REPL]] deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" @@ -249,6 +571,17 @@ uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" deps = ["Serialization"] uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +[[RecipesBase]] +git-tree-sha1 = "b3fb709f3c97bfc6e948be68beeecb55a0b340ae" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.1.1" + +[[RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "RecipesBase"] +git-tree-sha1 = "7a5026a6741c14147d1cb6daf2528a77ca28eb51" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.3.2" + [[Reexport]] git-tree-sha1 = "57d8440b0c7d98fc4f889e478e80f268d534c9d5" uuid = "189a3867-3050-52da-a836-e630ba90ab69" @@ -276,21 +609,68 @@ uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" deps = ["Distributed", "Mmap", "Random", "Serialization"] uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" +[[Showoff]] +deps = ["Dates", "Grisu"] +git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" +uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" +version = "1.0.3" + [[Sockets]] uuid = "6462fe0b-24de-5631-8697-dd941f90decc" +[[SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "2ec1962eba973f383239da22e75218565c390a96" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.0.0" + [[SparseArrays]] deps = ["LinearAlgebra", "Random"] uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +[[StaticArrays]] +deps = ["LinearAlgebra", "Random", "Statistics"] +git-tree-sha1 = "42378d3bab8b4f57aa1ca443821b752850592668" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.2.2" + [[Statistics]] deps = ["LinearAlgebra", "SparseArrays"] uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +[[StatsAPI]] +git-tree-sha1 = "1958272568dc176a1d881acb797beb909c785510" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.0.0" + +[[StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "2f6792d523d7448bbe2fec99eca9218f06cc746d" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.33.8" + +[[StructArrays]] +deps = ["Adapt", "DataAPI", "Tables"] +git-tree-sha1 = "44b3afd37b17422a62aea25f04c1f7e09ce6b07f" +uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" +version = "0.5.1" + [[TOML]] deps = ["Dates"] uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +[[TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "TableTraits", "Test"] +git-tree-sha1 = "aa30f8bb63f9ff3f8303a06c604c8500a69aa791" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.4.3" + [[Tar]] deps = ["ArgTools", "SHA"] uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" @@ -305,6 +685,11 @@ git-tree-sha1 = "bf8aacc899a1bd16522d0350e1e2310510d77236" uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" version = "0.5.9" +[[URIs]] +git-tree-sha1 = "97bbe755a53fe859669cd907f2d96aee8d2c1355" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.3.0" + [[UUIDs]] deps = ["Random", "SHA"] uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" @@ -312,10 +697,190 @@ uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" [[Unicode]] uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" +[[Wayland_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "dc643a9b774da1c2781413fd7b6dcd2c56bb8056" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.17.0+4" + +[[Wayland_protocols_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll"] +git-tree-sha1 = "2839f1c1296940218e35df0bbb220f2a79686670" +uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" +version = "1.18.0+4" + +[[XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "1acf5bdf07aa0907e0a37d3718bb88d4b687b74a" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.9.12+0" + +[[XSLT_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "Pkg", "XML2_jll", "Zlib_jll"] +git-tree-sha1 = "91844873c4085240b95e795f692c4cec4d805f8a" +uuid = "aed1982a-8fda-507f-9586-7b0439959a61" +version = "1.1.34+0" + +[[Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "5be649d550f3f4b95308bf0183b82e2582876527" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.6.9+4" + +[[Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4e490d5c960c314f33885790ed410ff3a94ce67e" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.9+4" + +[[Xorg_libXcursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "12e0eb3bc634fa2080c1c37fccf56f7c22989afd" +uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" +version = "1.2.0+4" + +[[Xorg_libXdmcp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fe47bd2247248125c428978740e18a681372dd4" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.3+4" + +[[Xorg_libXext_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "b7c0aa8c376b31e4852b360222848637f481f8c3" +uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" +version = "1.3.4+4" + +[[Xorg_libXfixes_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "0e0dc7431e7a0587559f9294aeec269471c991a4" +uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" +version = "5.0.3+4" + +[[Xorg_libXi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] +git-tree-sha1 = "89b52bc2160aadc84d707093930ef0bffa641246" +uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" +version = "1.7.10+4" + +[[Xorg_libXinerama_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll"] +git-tree-sha1 = "26be8b1c342929259317d8b9f7b53bf2bb73b123" +uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" +version = "1.1.4+4" + +[[Xorg_libXrandr_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "34cea83cb726fb58f325887bf0612c6b3fb17631" +uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" +version = "1.5.2+4" + +[[Xorg_libXrender_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "19560f30fd49f4d4efbe7002a1037f8c43d43b96" +uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" +version = "0.9.10+4" + +[[Xorg_libpthread_stubs_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "6783737e45d3c59a4a4c4091f5f88cdcf0908cbb" +uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" +version = "0.1.0+3" + +[[Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] +git-tree-sha1 = "daf17f441228e7a3833846cd048892861cff16d6" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.13.0+3" + +[[Xorg_libxkbfile_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "926af861744212db0eb001d9e40b5d16292080b2" +uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" +version = "1.1.0+4" + +[[Xorg_xcb_util_image_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "0fab0a40349ba1cba2c1da699243396ff8e94b97" +uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" +version = "0.4.0+1" + +[[Xorg_xcb_util_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll"] +git-tree-sha1 = "e7fd7b2881fa2eaa72717420894d3938177862d1" +uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" +version = "0.4.0+1" + +[[Xorg_xcb_util_keysyms_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "d1151e2c45a544f32441a567d1690e701ec89b00" +uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" +version = "0.4.0+1" + +[[Xorg_xcb_util_renderutil_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "dfd7a8f38d4613b6a575253b3174dd991ca6183e" +uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" +version = "0.3.9+1" + +[[Xorg_xcb_util_wm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "e78d10aab01a4a154142c5006ed44fd9e8e31b67" +uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" +version = "0.4.1+1" + +[[Xorg_xkbcomp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "4bcbf660f6c2e714f87e960a171b119d06ee163b" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.2+4" + +[[Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "5c8424f8a67c3f2209646d4425f3d415fee5931d" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.27.0+4" + +[[Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "79c31e7844f6ecf779705fbc12146eb190b7d845" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.4.0+3" + [[Zlib_jll]] deps = ["Libdl"] uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +[[Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "cc4bf3fdde8b7e3e9fa0351bdeedba1cf3b7f6e6" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.0+0" + +[[libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "acc685bcf777b2202a904cdcb49ad34c2fa1880c" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.14.0+4" + +[[libfdk_aac_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "7a5780a0d9c6864184b3a2eeeb833a0c871f00ab" +uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" +version = "0.1.6+4" + +[[libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "94d180a6d2b5e55e447e2d27a29ed04fe79eb30c" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.38+0" + +[[libvorbis_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] +git-tree-sha1 = "c45f4e40e7aafe9d086379e5578947ec8b95a8fb" +uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" +version = "1.3.7+0" + [[nghttp2_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" @@ -323,3 +888,21 @@ uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" [[p7zip_jll]] deps = ["Artifacts", "Libdl"] uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" + +[[x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "d713c1ce4deac133e3334ee12f4adff07f81778f" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2020.7.14+2" + +[[x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "487da2f8f2f0c8ee0e83f39d13037d6bbf0a45ab" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.0.0+3" + +[[xkbcommon_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "ece2350174195bb31de1a63bea3a41ae1aa593b6" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "0.9.1+5" diff --git a/Project.toml b/Project.toml index bcc2cfe..a314502 100644 --- a/Project.toml +++ b/Project.toml @@ -10,4 +10,5 @@ DelimitedFiles = "8bb1440f-4735-579b-a4ab-409b98df4dab" Libdl = "8f399da3-3557-5675-b5ff-fb832c97cbdb" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" diff --git a/figure5.sh b/figure5.sh new file mode 100755 index 0000000..43eb38a --- /dev/null +++ b/figure5.sh @@ -0,0 +1,31 @@ +#!/bin/bash +# +# This script describes how to reproduce the results of Figure 5. +# This is just an example for iillustration purposes. Different platforms +# (such as Summit cluster) may require different setups. +# +# For each run of admm_standalone.jl, it will generate iteration logs +# and timing results. The relevant timing results for Figure 5 are printed +# at the end of its run and will be the following: +# +# Branch/iter = %.2f (millisecs) +# +# The above timing results were used for Figure 5. +# +# Prerequisite: +# - CUDA library files should be accessible before executing this script, +# e.g., module load cuda/10.2.89. +# - CUDA aware MPI should be available. + +export JULIA_CUDA_VERBOSE=1 +export JULIA_MPI_BINARY="system" + +DATA=("case2868rte" "case6515rte" "case9241pegase" "case13659pegase" "case19402_goc") +PQ=(10 20 50 50 500) +VA=(1000 2000 5000 5000 50000) +ITER=(6000 15000 35000 45000 30000) + +for i in ${!DATA[@]}; do + julia --project ./src/admm_standalone.jl "./data/${DATA[$i]}" ${PQ[$i]} ${VA[$i]} ${ITER[$i]} true > output_gpu1_${DATA[$i]}.txt 2>&1 +done + diff --git a/figure6.sh b/figure6.sh new file mode 100755 index 0000000..c0831f2 --- /dev/null +++ b/figure6.sh @@ -0,0 +1,35 @@ +#!/bin/bash +# +# This script describes how to reproduce the results of Figure 6. +# This is just an example for iillustration purposes. Different platforms +# (such as Summit cluster) may require different setups. +# +# For each run of launch_mpi.jl, it will generate iteration logs +# and timing results. The relevant timing results for Figure 6 are printed +# at the end of its run and will be the following: +# +# (Br+MPI)/iter = %.2f (millisecs) +# +# We divide the above timing results by the timing results obtained when +# we use a single GPU. +# +# Prerequisite: +# - CUDA library files should be accessible before executing this script, +# e.g., module load cuda/10.2.89. +# - CUDA aware MPI should be available. + +export JULIA_CUDA_VERBOSE=1 +export JULIA_MPI_BINARY="system" + +DATA=("case2868rte" "case6515rte" "case9241pegase" "case13659pegase" "case19402_goc") +PQ=(10 20 50 50 500) +VA=(1000 2000 5000 5000 50000) +ITER=(6000 15000 35000 45000 30000) +NGPU=(2 3 4 5 6) + +for j in ${!NGPU[@]}; do + for i in ${!DATA[@]}; do + mpirun -np ${j} julia --project ./src/launch_mpi.jl "./data/${DATA[$i]}" ${PQ[$i]} ${VA[$i]} ${ITER[$i]} true > output_gpu${j}_${DATA[$i]}.txt 2>&1 + mv br_time_gpu.txt br_time_gpu${j}_${DATA[$i]}.txt + done +done diff --git a/figure7.sh b/figure7.sh new file mode 100755 index 0000000..2178e01 --- /dev/null +++ b/figure7.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# +# This script describes how to reproduce the results of Figure 7. +# This is just an example for iillustration purposes. Different platforms +# (such as Summit cluster) may require different setups. +# +# We need br_time_13659pegase.txt file which is obtained when we run +# with 6 GPUs over 13659pegase example. The file can be obtained by +# running figure6.sh. + +function usage() { + echo "Usage: ./figure7.sh case" + echo " case: the case file containing branch computation time of each GPU" +} + +if [[ $# != 1 ]]; then + usage + exit +fi + +julia --project ./src/heatmap.jl $1 diff --git a/figure8.sh b/figure8.sh new file mode 100755 index 0000000..e11f128 --- /dev/null +++ b/figure8.sh @@ -0,0 +1,31 @@ +#!/bin/bash +# +# This script describes how to reproduce the results of Figure 8. +# This is just an example for iillustration purposes. Different platforms +# (such as Summit cluster) may require different setups. +# +# For each run of launch_mpi.jl, it will generate iteration logs +# and timing results. The relevant timing results for Figure 8 are printed +# at the end of its run and will be the following: +# +# (Br+MPI)/iter = %.2f (millisecs) +# +# We use these numbers for the timings of 40 CPU cores and use the timings +# from Figure 6 for 6 GPUs. +# +# Prerequisite: +# - CUDA library files should be accessible before executing this script, +# e.g., module load cuda/10.2.89. +# - CUDA aware MPI should be available. + +export JULIA_CUDA_VERBOSE=1 +export JULIA_MPI_BINARY="system" + +DATA=("case2868rte" "case6515rte" "case9241pegase" "case13659pegase" "case19402_goc") +PQ=(10 20 50 50 500) +VA=(1000 2000 5000 5000 50000) +ITER=(6000 15000 35000 45000 30000) + +for i in ${!DATA[@]}; do + mpirun -np 40 julia --project ./src/launch_mpi.jl "./data/${DATA[$i]}" ${PQ[$i]} ${VA[$i]} ${ITER[$i]} false > output_cpu40_${DATA[$i]}.txt 2>&1 +done diff --git a/launch_mpi.jl b/launch_mpi.jl deleted file mode 100644 index 6a2b2c9..0000000 --- a/launch_mpi.jl +++ /dev/null @@ -1,19 +0,0 @@ -using ExaTron -using MPI -MPI.Init() - -comm = MPI.COMM_WORLD - -datafile = "../admm/data/"*ARGS[1] -pq_val = parse(Float64, ARGS[2]) -va_val = parse(Float64, ARGS[3]) -max_iter = parse(Int, ARGS[4]) -gpu = parse(Bool, ARGS[5]) - -# Warm-up -@time ExaTron.admm_rect_gpu_mpi(datafile; iterlim=1, rho_pq=pq_val, rho_va=va_val, use_gpu=gpu, use_polar=true, scale=1e-4) -# Computation -@time ExaTron.admm_rect_gpu_mpi(datafile; iterlim=max_iter, rho_pq=pq_val, rho_va=va_val, use_gpu=gpu, use_polar=true, scale=1e-4) - -MPI.Finalize() - diff --git a/src/acopf_admm_gpu.jl b/src/acopf_admm_gpu.jl index 025fc33..b63ecd8 100644 --- a/src/acopf_admm_gpu.jl +++ b/src/acopf_admm_gpu.jl @@ -215,7 +215,7 @@ function dual_residual_kernel(n::Int, rd::CuDeviceArray{Float64,1}, end function admm_rect_gpu(case; iterlim=800, rho_pq=400.0, rho_va=40000.0, scale=1e-4, - use_gpu=false, use_polar=true, gpu_no=1) + use_gpu=false, use_polar=true, gpu_no=-1) data = opf_loaddata(case) ngen = length(data.generators) @@ -237,7 +237,7 @@ function admm_rect_gpu(case; iterlim=800, rho_pq=400.0, rho_va=40000.0, scale=1e Kf = 100 Kf_mean = 10 - if use_gpu + if use_gpu && gpu_no >= 0 CUDA.device!(gpu_no) end @@ -417,17 +417,17 @@ function admm_rect_gpu(case; iterlim=800, rho_pq=400.0, rho_va=40000.0, scale=1e if use_gpu copyto!(u_curr, cu_u_curr) end - @printf(" ** Time\n") - @printf("Generator = %.2f\n", time_gen) - @printf("Branch = %.2f\n", time_br) - @printf("Bus = %.2f\n", time_bus) - @printf("Total = %.2f\n", time_gen + time_br + time_bus) - + objval = sum(data.generators[g].coeff[data.generators[g].n-2]*(baseMVA*u_curr[gen_start+2*(g-1)])^2 + data.generators[g].coeff[data.generators[g].n-1]*(baseMVA*u_curr[gen_start+2*(g-1)]) + data.generators[g].coeff[data.generators[g].n] for g in 1:ngen) @printf("Objective value = %.6e\n", objval) + @printf(" ** Time\n") + @printf("Generator = %.2f (secs)\n", time_gen) + @printf("Bus = %.2f (secs)\n", time_bus) + @printf("Branch = %.2f (secs)\n", time_br) + @printf("Branch/iter = %.2f (millisecs)\n", 1000.0*(time_br / it)) return end @@ -445,6 +445,7 @@ function admm_rect_gpu_mpi( nvar = 2*ngen + 8*nline if use_gpu @assert MPI.has_cuda() + @assert MPI.Comm_size(comm) == CUDA.ndevices() end # MPI settings @@ -558,7 +559,7 @@ function admm_rect_gpu_mpi( MPI.Scatter!(u_lines_root, u_local, root, comm) MPI.Scatter!(rho_lines_root, rho_local, root, comm) - max_auglag = 50 + max_auglag = 50 nblk_gen = div(ngen, 32, RoundUp) nblk_br = nline @@ -580,6 +581,10 @@ function admm_rect_gpu_mpi( # GPU settings shmem_size = sizeof(Float64)*(14*n+3*n^2) + sizeof(Int)*(4*n) + # - div(nblk_br / number of GPUs, RoundUp) + nlines_actual = min(nlines_local, nline - shift_lines) + nblk_br_actual = min(nblk_br_local, nline - shift_lines) + while it < iterlim it += 1 @@ -601,13 +606,14 @@ function admm_rect_gpu_mpi( # - div(nblk_br / number of GPUs, RoundUp) # scatter / gather + MPI.Barrier(comm) + tcpu_mpi = @timed begin MPI.Scatter!(v_lines_root, v_local, root, comm) MPI.Scatter!(l_lines_root, l_local, root, comm) end time_br_scatter += tcpu_mpi.time - nlines_actual = min(nlines_local, nline - shift_lines) tcpu = @timed auglag_it, tron_it = polar_kernel_cpu(n, nlines_actual, 1, scale, u_local, v_local, l_local, rho_local, shift_lines, param, YffR, YffI, YftR, YftI, @@ -652,6 +658,8 @@ function admm_rect_gpu_mpi( time_gen += tgpu.time end + MPI.Barrier(comm) + # - Broadcast cu_v_curr and cu_l_curr to GPUs. tgpu_mpi = @timed begin MPI.Scatter!(v_lines_root, v_local, root, comm) @@ -659,8 +667,6 @@ function admm_rect_gpu_mpi( end time_br_scatter += tgpu_mpi.time - # - div(nblk_br / number of GPUs, RoundUp) - nblk_br_actual = min(nblk_br_local, nline - shift_lines) tgpu = CUDA.@timed @cuda threads=32 blocks=nblk_br_actual shmem=shmem_size polar_kernel(n, nline, 1, scale, u_local, v_local, l_local, rho_local, shift_lines, cuParam, cuYffR, cuYffI, cuYftR, cuYftI, @@ -698,15 +704,369 @@ function admm_rect_gpu_mpi( copyto!(u_curr, cu_u_curr) end + if is_master + objval = sum(data.generators[g].coeff[data.generators[g].n-2]*(baseMVA*u_curr[gen_start+2*(g-1)])^2 + + data.generators[g].coeff[data.generators[g].n-1]*(baseMVA*u_curr[gen_start+2*(g-1)]) + + data.generators[g].coeff[data.generators[g].n] + for g in 1:ngen) + @printf("Objective value = %.6e\n", objval) + end + rank = MPI.Comm_rank(comm) @printf(" ** Time\n") - @printf("[%d] Generator = %.2f\n", rank, time_gen) - @printf("[%d] Branch = %.2f\n", rank, time_br) - @printf("[%d] Bus = %.2f\n", rank, time_bus) - @printf("[%d] G+Br+Bus = %.2f\n", rank, time_gen + time_br + time_bus) - @printf("[%d] Scatter = %.2f\n", rank, time_br_scatter) - @printf("[%d] Gather = %.2f\n", rank, time_br_gather) - @printf("[%d] MPI(S+G) = %.2f\n", rank, time_br_scatter + time_br_gather) + @printf("[%d] Generator = %.2f (secs)\n", rank, time_gen) + @printf("[%d] Bus = %.2f (secs)\n", rank, time_bus) + @printf("[%d] Branch = %.2f (secs)\n", rank, time_br) + @printf("[%d] Scatter = %.2f (secs)\n", rank, time_br_scatter) + @printf("[%d] Gather = %.2f (secs)\n", rank, time_br_gather) + @printf("[%d] MPI(S+G) = %.2f (secs)\n", rank, time_br_scatter + time_br_gather) + @printf("[%d] Br+MPI = %.2f (secs)\n", rank, time_br + time_br_scatter + time_br_gather) + @printf("[%d] (Br+MPI)/iter = %.2f (millisecs)\n", rank, 1000.0*((time_br + time_br_scatter + time_br_gather) / it)) + + return +end + +function admm_rect_gpu_mpi_recv_send( + case; + iterlim=800, rho_pq=400.0, rho_va=40000.0, scale=1e-4, use_gpu=false, use_polar=true, gpu_no=1, + comm::MPI.Comm=MPI.COMM_WORLD, +) + data = opf_loaddata(case) + + ngen = length(data.generators) + nline = length(data.lines) + nbus = length(data.buses) + nvar = 2*ngen + 8*nline + if use_gpu + @assert MPI.has_cuda() + end + + # MPI settings + root = 0 + rank = MPI.Comm_rank(comm) + is_master = MPI.Comm_rank(comm) == root + n_processes = MPI.Comm_size(comm) + nlines_local = div(nline, n_processes, RoundUp) + nlines_padded = n_processes * nlines_local + + nvar_padded = 2*ngen + 8 * nlines_padded + + baseMVA = data.baseMVA + n = (use_polar == true) ? 4 : 10 + mu_max = 1e8 + rho_max = 1e6 + rho_min_pq = 5.0 + rho_min_w = 5.0 + eps_rp = 1e-4 + eps_rp_min = 1e-5 + rt_inc = 2.0 + rt_dec = 2.0 + eta = 0.99 + Kf = 100 + Kf_mean = 10 + + if use_gpu + CUDA.device!(MPI.Comm_rank(comm) % CUDA.ndevices()) + end + + ybus = Ybus{Array{Float64}}(computeAdmitances(data.lines, data.buses, data.baseMVA; VI=Array{Int}, VD=Array{Float64})...) + + pgmin, pgmax, qgmin, qgmax, c2, c1, c0 = get_generator_data(data) + YshR, YshI, YffR, YffI, YftR, YftI, YttR, YttI, YtfR, YtfI, FrBound, ToBound = get_branch_data(data) + FrStart, FrIdx, ToStart, ToIdx, GenStart, GenIdx, Pd, Qd = get_bus_data(data) + + cu_pgmin, cu_pgmax, cu_qgmin, cu_qgmax, cu_c2, cu_c1, cu_c0 = get_generator_data(data; use_gpu=use_gpu) + cuYshR, cuYshI, cuYffR, cuYffI, cuYftR, cuYftI, cuYttR, cuYttI, cuYtfR, cuYtfI, cuFrBound, cuToBound = get_branch_data(data; use_gpu=use_gpu) + cu_FrStart, cu_FrIdx, cu_ToStart, cu_ToIdx, cu_GenStart, cu_GenIdx, cu_Pd, cu_Qd = get_bus_data(data; use_gpu=use_gpu) + + gen_start = 1 + line_start = 2*ngen + 1 + + # Allocations + u_curr = zeros(nvar_padded) + v_curr = zeros(nvar_padded) + l_curr = zeros(nvar_padded) + u_prev = zeros(nvar_padded) + v_prev = zeros(nvar_padded) + l_prev = zeros(nvar_padded) + rho = zeros(nvar_padded) + rd = zeros(nvar_padded) + rp = zeros(nvar_padded) + rp_old = zeros(nvar_padded) + rp_k0 = zeros(nvar_padded) + param = zeros(31, nlines_padded) + wRIij = zeros(2*nline) + + init_values(data, ybus, gen_start, line_start, + rho_pq, rho_va, u_curr, v_curr, l_curr, rho, wRIij) + + + if use_gpu + cu_u_curr = CuArray{Float64}(undef, nvar_padded) + cu_v_curr = CuArray{Float64}(undef, nvar_padded) + cu_l_curr = CuArray{Float64}(undef, nvar_padded) + cu_u_prev = CuArray{Float64}(undef, nvar_padded) + cu_v_prev = CuArray{Float64}(undef, nvar_padded) + cu_l_prev = CuArray{Float64}(undef, nvar_padded) + cu_rho = CuArray{Float64}(undef, nvar_padded) + cu_rd = CuArray{Float64}(undef, nvar_padded) + cu_rp = CuArray{Float64}(undef, nvar_padded) + cu_rp_old = CuArray{Float64}(undef, nvar_padded) + cu_rp_k0 = CuArray{Float64}(undef, nvar_padded) + cuParam = CuArray{Float64}(undef, (31, nlines_padded)) + cuWRIij = CuArray{Float64}(undef, 2*nline) + + copyto!(cu_u_curr, u_curr) + copyto!(cu_v_curr, v_curr) + copyto!(cu_l_curr, l_curr) + copyto!(cu_rho, rho) + copyto!(cuParam, param) + copyto!(cuWRIij, wRIij) + end + + # MPI: Global info + + root_req = Array{MPI.Request}(undef, n_processes-1) + vl_req = Array{MPI.Request}(undef, 2) + + if use_gpu + u_lines_view = Array{CuArray{Float64}}(undef, n_processes) + v_lines_view = Array{CuArray{Float64}}(undef, n_processes) + l_lines_view = Array{CuArray{Float64}}(undef, n_processes) + rho_view = Array{CuArray{Float64}}(undef, n_processes) + + for i=1:n_processes + start_addr = line_start + (i-1)*(8*nlines_local) + u_lines_view[i] = @view cu_u_curr[start_addr:start_addr+(8*nlines_local)-1] + v_lines_view[i] = @view cu_v_curr[start_addr:start_addr+(8*nlines_local)-1] + l_lines_view[i] = @view cu_l_curr[start_addr:start_addr+(8*nlines_local)-1] + rho_view[i] = @view cu_rho[start_addr:start_addr+(8*nlines_local)-1] + end + + u_local = u_lines_view[rank+1] + v_local = v_lines_view[rank+1] + l_local = l_lines_view[rank+1] + rho_local = rho_view[rank+1] + else + u_lines_view = Array{SubArray{Float64}}(undef, n_processes) + v_lines_view = Array{SubArray{Float64}}(undef, n_processes) + l_lines_view = Array{SubArray{Float64}}(undef, n_processes) + rho_view = Array{SubArray{Float64}}(undef, n_processes) + + for i=1:n_processes + start_addr = line_start + (i-1)*(8*nlines_local) + u_lines_view[i] = @view u_curr[start_addr:start_addr+(8*nlines_local)-1] + v_lines_view[i] = @view v_curr[start_addr:start_addr+(8*nlines_local)-1] + l_lines_view[i] = @view l_curr[start_addr:start_addr+(8*nlines_local)-1] + rho_view[i] = @view rho[start_addr:start_addr+(8*nlines_local)-1] + end + + u_local = u_lines_view[rank+1] + v_local = v_lines_view[rank+1] + l_local = l_lines_view[rank+1] + rho_local = rho_view[rank+1] + + end + + # Measure load imbalance. + br_single_time = zeros(1) + br_pk_all = zeros(n_processes, iterlim) + + MPI.Barrier(comm) + + max_auglag = 50 + + nblk_gen = div(ngen, 32, RoundUp) + nblk_br = nline + nblk_br_local = nlines_local + nblk_bus = div(nbus, 32, RoundUp) + + ABSTOL = 1e-6 + RELTOL = 1e-5 + + it = 0 + time_gen = time_br = time_bus = 0 + time_br_scatter = time_br_gather = 0 + + h_u_curr = zeros(nvar) + h_param = zeros(31, nline) + h_wRIij = zeros(2*nline) + + shift_lines = MPI.Comm_rank(comm) * nlines_local + nlines_actual = min(nlines_local, nline - shift_lines) + nblk_br_actual = min(nblk_br_local, nline - shift_lines) + + # GPU settings + shmem_size = sizeof(Float64)*(14*n+3*n^2) + sizeof(Int)*(4*n) + + while it < iterlim + it += 1 + + # CPU code + if !use_gpu + + if is_master + u_prev .= u_curr + v_prev .= v_curr + l_prev .= l_curr + tcpu = @timed generator_kernel_cpu(baseMVA, ngen, gen_start, u_curr, v_curr, l_curr, rho, + pgmin, pgmax, qgmin, qgmax, c2, c1) + time_gen += tcpu.time + end + + # MPI routines to be implemented: + # - Broadcast cu_v_curr and cu_l_curr to GPUs. + # - Collect cu_u_curr. + # - div(nblk_br / number of GPUs, RoundUp) + # scatter / gather + + MPI.Barrier(comm) + + tcpu_mpi = @timed begin + if is_master + for i=1:n_processes-1 + MPI.Isend(v_lines_view[i+1], i, 1, comm) + MPI.Isend(l_lines_view[i+1], i, 2, comm) + end + else + vl_req[1] = MPI.Irecv!(v_local, root, 1, comm) + vl_req[2] = MPI.Irecv!(l_local, root, 2, comm) + MPI.Waitall!(vl_req) + end + end + time_br_scatter += tcpu_mpi.time + + tcpu = @timed auglag_it, tron_it = polar_kernel_cpu(n, nlines_actual, 1, scale, + u_local, v_local, l_local, rho_local, + shift_lines, param, YffR, YffI, YftR, YftI, + YttR, YttI, YtfR, YtfI, FrBound, ToBound) + + time_br += tcpu.time + tcpu_mpi = @timed begin + if is_master + for i=1:n_processes-1 + root_req[i] = MPI.Irecv!(u_lines_view[i+1], i, i, comm) + end + MPI.Waitall!(root_req) + else + MPI.Isend(u_local, root, rank, comm) + end + end + time_br_gather += tcpu_mpi.time + + if is_master + tcpu = @timed bus_kernel_cpu(baseMVA, nbus, gen_start, line_start, + FrStart, FrIdx, ToStart, ToIdx, GenStart, + GenIdx, Pd, Qd, u_curr, v_curr, l_curr, rho, YshR, YshI) + time_bus += tcpu.time + + l_curr .+= rho .* (u_curr .- v_curr) + rd .= -rho .* (v_curr .- v_prev) + rp .= u_curr .- v_curr + #rp_old .= u_prev .- v_prev + + primres = norm(rp) + dualres = norm(rd) + + eps_pri = sqrt(length(l_curr))*ABSTOL + RELTOL*max(norm(u_curr), norm(-v_curr)) + eps_dual = sqrt(length(u_curr))*ABSTOL + RELTOL*norm(l_curr) + + @printf("[CPU] %10d %.6e %.6e %.6e %.6e %6.2f %6.2f\n", + it, primres, dualres, eps_pri, eps_dual, auglag_it, tron_it) + end + # GPU code + else + if is_master + @cuda threads=64 blocks=(div(nvar-1, 64)+1) copy_data_kernel(nvar, cu_u_prev, cu_u_curr) + @cuda threads=64 blocks=(div(nvar-1, 64)+1) copy_data_kernel(nvar, cu_v_prev, cu_v_curr) + @cuda threads=64 blocks=(div(nvar-1, 64)+1) copy_data_kernel(nvar, cu_l_prev, cu_l_curr) + CUDA.synchronize() + + tgpu = CUDA.@timed @cuda threads=32 blocks=nblk_gen generator_kernel(baseMVA, ngen, gen_start, + cu_u_curr, cu_v_curr, cu_l_curr, cu_rho, + cu_pgmin, cu_pgmax, cu_qgmin, cu_qgmax, cu_c2, cu_c1) + + time_gen += tgpu.time + end + + MPI.Barrier(comm) + + # - Broadcast cu_v_curr and cu_l_curr to GPUs. + tgpu_mpi = @timed begin + if is_master + for i=1:n_processes-1 + MPI.Isend(v_lines_view[i+1], i, 1, comm) + MPI.Isend(l_lines_view[i+1], i, 2, comm) + end + else + vl_req[1] = MPI.Irecv!(v_local, root, 1, comm) + vl_req[2] = MPI.Irecv!(l_local, root, 2, comm) + MPI.Waitall!(vl_req) + end + end + time_br_scatter += tgpu_mpi.time + + # - div(nblk_br / number of GPUs, RoundUp) + tgpu = CUDA.@timed @cuda threads=32 blocks=nblk_br_actual shmem=shmem_size polar_kernel(n, nline, 1, scale, + u_local, v_local, l_local, rho_local, + shift_lines, cuParam, cuYffR, cuYffI, cuYftR, cuYftI, + cuYttR, cuYttI, cuYtfR, cuYtfI, cuFrBound, cuToBound + ) + time_br += tgpu.time + + # - Collect cu_u_curr. + tgpu_mpi = @timed begin + if is_master + for i=1:n_processes-1 + root_req[i] = MPI.Irecv!(u_lines_view[i+1], i, i, comm) + end + MPI.Waitall!(root_req) + else + MPI.Isend(u_local, root, rank, comm) + end + end + time_br_gather += tgpu_mpi.time + + MPI.Barrier(comm) + + br_single_time[1] = tgpu.time + if is_master + br_pk_all[1,it] = br_single_time[1] + for i=1:n_processes-1 + MPI.Recv!(br_single_time, i, i, comm) + br_pk_all[i+1,it] = br_single_time[1] + end + else + MPI.Send(br_single_time, root, rank, comm) + end + + MPI.Barrier(comm) + + if is_master + tgpu = CUDA.@timed @cuda threads=32 blocks=nblk_bus bus_kernel(baseMVA, nbus, gen_start, line_start, + cu_FrStart, cu_FrIdx, cu_ToStart, cu_ToIdx, cu_GenStart, + cu_GenIdx, cu_Pd, cu_Qd, cu_u_curr, cu_v_curr, cu_l_curr, + cu_rho, cuYshR, cuYshI) + time_bus += tgpu.time + @cuda threads=64 blocks=(div(nvar-1, 64)+1) update_multiplier_kernel(nvar, cu_l_curr, cu_u_curr, cu_v_curr, cu_rho) + @cuda threads=64 blocks=(div(nvar-1, 64)+1) primal_residual_kernel(nvar, cu_rp, cu_u_curr, cu_v_curr) + @cuda threads=64 blocks=(div(nvar-1, 64)+1) dual_residual_kernel(nvar, cu_rd, cu_v_prev, cu_v_curr, cu_rho) + CUDA.synchronize() + + gpu_primres = CUDA.norm(cu_rp) + gpu_dualres = CUDA.norm(cu_rd) + + gpu_eps_pri = sqrt(length(l_curr))*ABSTOL + RELTOL*max(CUDA.norm(cu_u_curr), CUDA.norm(cu_v_curr)) + gpu_eps_dual = sqrt(length(u_curr))*ABSTOL + RELTOL*CUDA.norm(cu_l_curr) + + @printf("[GPU] %10d %.6e %.6e %.6e %.6e\n", it, gpu_primres, gpu_dualres, gpu_eps_pri, gpu_eps_dual) + end + end + end + + if use_gpu + copyto!(u_curr, cu_u_curr) + end if is_master objval = sum(data.generators[g].coeff[data.generators[g].n-2]*(baseMVA*u_curr[gen_start+2*(g-1)])^2 + @@ -714,7 +1074,29 @@ function admm_rect_gpu_mpi( data.generators[g].coeff[data.generators[g].n] for g in 1:ngen) @printf("Objective value = %.6e\n", objval) - end - return + if use_gpu + fout = open("br_time_gpu.txt", "w") + for i=1:iterlim + @printf(fout, "%5d", i) + for p=1:n_processes + @printf(fout, "\t%.6e", br_pk_all[p,i]) + end + @printf(fout, "\n") + end + close(fout) + end + end + + @printf(" ** Time\n") + @printf("[%d] Generator = %.2f (secs)\n", rank, time_gen) + @printf("[%d] Bus = %.2f (secs)\n", rank, time_bus) + @printf("[%d] Branch = %.2f (secs)\n", rank, time_br) + @printf("[%d] Scatter = %.2f (secs)\n", rank, time_br_scatter) + @printf("[%d] Gather = %.2f (secs)\n", rank, time_br_gather) + @printf("[%d] MPI(S+G) = %.2f (secs)\n", rank, time_br_scatter + time_br_gather) + @printf("[%d] Br+MPI = %.2f (secs)\n", rank, time_br + time_br_scatter + time_br_gather) + @printf("[%d] (Br+MPI)/iter = %.2f (millisecs)\n", rank, 1000.0*((time_br + time_br_scatter + time_br_gather) / it)) + + return end diff --git a/src/admm_standalone.jl b/src/admm_standalone.jl index 790b9c0..db325ce 100644 --- a/src/admm_standalone.jl +++ b/src/admm_standalone.jl @@ -1,6 +1,6 @@ using ExaTron -datafile = "../admm/data/"*ARGS[1] +datafile = ARGS[1] pq_val = parse(Float64, ARGS[2]) va_val = parse(Float64, ARGS[3]) max_iter = parse(Int, ARGS[4]) @@ -14,4 +14,4 @@ ExaTron.admm_rect_gpu(datafile; # Run ExaTron.admm_rect_gpu(datafile; - iterlim=max_iter, rho_pq=pq_val, rho_va=va_val, scale=1e-4, use_polar=true, use_gpu=gpu) \ No newline at end of file + iterlim=max_iter, rho_pq=pq_val, rho_va=va_val, scale=1e-4, use_polar=true, use_gpu=gpu) diff --git a/src/heatmap.jl b/src/heatmap.jl new file mode 100644 index 0000000..bf62b43 --- /dev/null +++ b/src/heatmap.jl @@ -0,0 +1,24 @@ +using Plots + +function draw_heatmap(filename,nx,ny;scale=1e3) + # x: iteration + # y: processor + + fin = open(filename, "r") + lines = readlines(fin) + z = zeros(nx,ny) + + for l in lines + cols = split(l) + y = parse(Int, cols[1]) + for x=1:6 + z[x,y] = scale * parse(Float64, cols[x+1]) + end + end + + + return z +end + +z = draw_heatmap(ARGS[1], 6, 41126) +savefig(heatmap(z[:,35000:36000], xlabel="ADMM Iteration", ylabel="GPU", colorbar_title="Time (ms)"), splitext(ARGS[1])[1]*".pdf") diff --git a/src/launch_mpi.jl b/src/launch_mpi.jl new file mode 100644 index 0000000..5bb5549 --- /dev/null +++ b/src/launch_mpi.jl @@ -0,0 +1,30 @@ +using ExaTron +using MPI +MPI.Init() + +comm = MPI.COMM_WORLD + +datafile = ARGS[1] +pq_val = parse(Float64, ARGS[2]) +va_val = parse(Float64, ARGS[3]) +max_iter = parse(Int, ARGS[4]) +gpu = parse(Bool, ARGS[5]) + +# Warm-up +if gpu + @time ExaTron.admm_rect_gpu_mpi_recv_send(datafile; iterlim=1, rho_pq=pq_val, rho_va=va_val, use_gpu=gpu, use_polar=true, scale=1e-4) +else + @time ExaTron.admm_rect_gpu_mpi(datafile; iterlim=1, rho_pq=pq_val, rho_va=va_val, use_gpu=gpu, use_polar=true, scale=1e-4) +end + +MPI.Barrier(comm) + +# Computation +if gpu + @time ExaTron.admm_rect_gpu_mpi_recv_send(datafile; iterlim=max_iter, rho_pq=pq_val, rho_va=va_val, use_gpu=gpu, use_polar=true, scale=1e-4) +else + @time ExaTron.admm_rect_gpu_mpi(datafile; iterlim=max_iter, rho_pq=pq_val, rho_va=va_val, use_gpu=gpu, use_polar=true, scale=1e-4) +end + +MPI.Finalize() + diff --git a/src/load_imbalance.jl b/src/load_imbalance.jl new file mode 100644 index 0000000..09353e4 --- /dev/null +++ b/src/load_imbalance.jl @@ -0,0 +1,17 @@ +using DelimitedFiles +using Statistics +using Printf + +function load_imbalance(file) + data = readdlm(file) + val = data[:,2:end] + t_max = maximum(val; dims=2) + t_mean = mean(val; dims=2) + nu_pk = (t_max ./ t_mean .- 1.0) .* 100.0 + return nu_pk +end + +nu_pk = load_imbalance(ARGS[1]) +@printf("case = %s\n", ARGS[1]) +@printf("nu_max = %.2f nu_min = %.2f nu_mean = %.2f\n", + maximum(nu_pk), minimum(nu_pk), mean(nu_pk)) diff --git a/src/opfdata.jl b/src/opfdata.jl index 70fcd1a..05649be 100644 --- a/src/opfdata.jl +++ b/src/opfdata.jl @@ -194,11 +194,12 @@ function opf_loaddata(case_name, lineOff=Line(); VI=Array{Int}, VD=Array{Float64 @assert branch_arr[i,11] == 1 #should be on since we discarded all other lit += 1 lines[lit] = Line(branch_arr[i, 1:13]...) + #= if (lines[lit].angmin != 0 || lines[lit].angmax != 0) && (lines[lit].angmin>-360 || lines[lit].angmax<360) println("Voltage bounds on line ", i, " with angmin ", lines[lit].angmin, " and angmax ", lines[lit].angmax) error("Bounds of voltage angles are still to be implemented.") end - + =# end @assert lit == num_on diff --git a/src/polar_kernel.jl b/src/polar_kernel.jl index d177209..fb2cc58 100644 --- a/src/polar_kernel.jl +++ b/src/polar_kernel.jl @@ -66,7 +66,7 @@ function polar_kernel(n::Int, nlines::Int, line_start::Int, scale::Float64, CUDA.sync_threads() - status, minor_iter = tron_kernel(n, shift_lines, 500, 200, 1e-6, scale, true, x, xl, xu, + status, minor_iter = tron_kernel(n, shift_lines, 500, 200, 5*1e-4, scale, true, x, xl, xu, param, YffR, YffI, YftR, YftI, YttR, YttI, YtfR, YtfI) vi_vj_cos = x[1]*x[2]*cos(x[3] - x[4]) @@ -163,7 +163,7 @@ function polar_kernel_cpu(n::Int, nline::Int, line_start::Int, scale::Float64, nele_hess = 10 tron = ExaTron.createProblem(4, xl, xu, nele_hess, eval_f_cb, eval_g_cb, eval_h_cb; - :tol => 1e-6, :matrix_type => :Dense, :max_minor => 200, + :tol => 5*1e-4, :matrix_type => :Dense, :max_minor => 200, :frtol => 1e-12) tron.x .= x diff --git a/table5.sh b/table5.sh new file mode 100755 index 0000000..099c06b --- /dev/null +++ b/table5.sh @@ -0,0 +1,14 @@ +#!/bin/bash +# +# This script describes how to reproduce the results of Table 5. +# This requires a br_time_gpu_case.txt file generated from figure6.sh. +# Since we compute the load imbalance based on the solution time, +# the values could be different from each run. + +export JULIA_CUDA_VERBOSE=1 +export JULIA_MPI_BINARY="system" + +DATA=("2868rte" "6515rte" "9241pegase" "13659pegase" "19402goc") +for i in ${!DATA[@]}; do + julia --project ./src/load_imbalance.jl "./br_time_gpu_${DATA[$i]}.txt" +done From 84c53cd653f989b6b6df48b3153d0952c82ecf4b Mon Sep 17 00:00:00 2001 From: youngdae Date: Fri, 4 Jun 2021 18:08:04 -0500 Subject: [PATCH 3/5] Update README.md --- README.md | 174 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 142 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 823c07e..2770299 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ # ExaTron.jl -This is a TRON solver implementation in Julia. -The intention is to make it work on GPUs as well. -Currently, we translated the Fortran implementation of [TRON](https://www.mcs.anl.gov/~more/tron) -into Julia. +ExaTron.jl implements a trust-region Newton algorithm for bound constrained batch nonlinear +programming on GPUs. +Its algorithm is based on [Lin and More](https://epubs.siam.org/doi/10.1137/S1052623498345075) +and [TRON](https://www.mcs.anl.gov/~more/tron). ## Installation @@ -12,34 +12,144 @@ This package can be installed by cloning this repository: ] add https://github.com/exanauts/ExaTron.jl ``` -## Performance ExaTron with ADMM on GPUs - -With `@inbounds` attached to every array access and the use of instruction -parallelism instead of `for` loop, timings have reduced significantly. -The most recent results are as follows: - -| Data | # active branches | Objective | Primal feasibility | Dual feasibility | Time (secs) | rho_pq | rho_va | -| ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| case1354pegase | 1991 | 7.400441e+04 | 1.186926e-05 | 9.799325e-03 | 24.78 | 10.0 | 1000.0 | -| case2869pegase | 4582 | 1.338728e+05 | 1.831719e-04 | 3.570605e-02 | 42.86 | 10.0 | 1000.0 | -| case9241pegase | 16049 | 3.139228e+05 | 2.526600e-03 | 8.328549e+00 | 98.88 | 50.0 | 5000.0 | -| case13659pegase | 20467 | 3.841941e+05 | 5.315441e-03 | 9.915973e+00 | 116.84 | 50.0 | 5000.0 | -| case19402_goc | 34704 | 1.950577e+06 | 3.210911e-03 | 4.706196e+00 | 239.45 | 500.0 | 5000.0 | - -For better accuracy, angle variables with constraints `\theta_i - \theta_j = \atan2(wI_{ij}, wR_{ij})` -were added. -This enables us to achieve a more accurate solution, since when there is a cycle in the network -the constraint forces that its sum of angles in the cycle is zero. -With new variables and constraints, experimental results are below. -We note that objective values have increased in most cases, which became closer to the values obtained -from Ipopt. - -| Data | # active branches | Objective | Primal feasibility | Dual feasibility | Time (secs) | rho_pq | rho_va | # Iterations | -| ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| case1354pegase | 1,991 | 7.406087e+04 | 3.188928e-05 | 1.200796e-02 | 20.28 | 10.0 | 1000.0 | 5,000 | -| case2869pegase | 4,582 | 1.339846e+05 | 2.123712e-04 | 2.228853e-01 | 35.74 | 10.0 | 1000.0 | 5,000 | -| case9241pegase | 16,049 | 3.158906e+05 | 6.464865e-03 | 5.607324e+00 | 139.41 | 50.0 | 5000.0 | 6,000 | -| case13659pegase | 20,467 | 3.861735e+05 | 5.794895e-03 | 8.512909e+00 | 187.97 | 50.0 | 5000.0 | 7,000 | +## How to run + +We note that the following is for illustration purposes only. +If you want to run it on a HPC cluster, you may want to follow instructions specific to the HPC software. + +### Using a single GPU + +```bash +$ julia --project ./src/admm_standalone.jl ./data/casename pq_val va_val iterlim true +``` +where `casename` is the filename of a power network, `pq_val` is an initial penalty value +for power values, `va_val` an initial penalty value for voltage values, `iterlim` the +maximum iteration limit, and `true|false` specifies whether to use GPU or CPU. +Power network files are provided in the `data` directory. + +The following table shows what values need to be specified for parameters: + +| casename | pq_val | va_val | iterlim | +| -------: | -----: | -----: | ------: | +| case2868rte | 10.0 | 1000.0 | 6,000 | +| case6515rte | 20.0 | 2000.0 | 15,000 | +| case9241pegase | 50.0 | 5000.0 | 35,000 | +| case13659pegase | 50.0 | 5000.0 | 45,000 | +| case19402_goc | 500.0 | 50000.0 | 30,000 | + +For example, if you want to solve `case19402_goc` using a single GPU, you need to run +```bash +$ julia --project ./src/admm_standalone.jl ./data/case19402_goc 500 50000 30000 true +``` + +### Using multiple GPUs + +If you want to use `N` GPUs, we launch `N` MPI processes and execute `launch_mpi.jl`. + +```bash +$ mpirun -np N julia --project ./src/launch_mpi.jl ./data/casename pq_val va_val iterlim true +``` + +We assume that all of the MPI processes can see the `N` number of GPUs. Otherwise, it will generate an error. +The parameter values are the same as the single GPU case, except that we use the following actual +iteration limit for each case. If you see the logs, the total number of iterations is the same as single GPU case. +| casename | iterlim | +| -------: | ------: | +| case2868rte | 5648 | +| case6515rte | 13651 | +| case9241pegase | 30927 | +| case13659pegase | 41126 | +| case19402_goc | 28358 | + +## Reproducing experiments + +We describe how to reproduce experiments in Section 6 of our manuscript. +For each figure or table, we provide a corresponding script to reproduce results. +Note that the following table shows correspondence between the casename and the size of batch. +| casename | batch size | +| -------: | ---------: | +| case2868rte | 3.8K | +| case6515rte | 9K | +| case9241pegase | 16K | +| case13659pegase | 20K | +| case19402_goc | 34K | + +### Figure 5 + +```bash +$ ./figure5.sh +``` + +It will generate `output_gpu1_casename.txt` file for each `casename`. Near the end of the file, you will see +the timing results: `Branch/iter = %.2f (millisecs)` is the relevant result. +For example, in order to obtain timing results for `case19402_goc`, we read the following line around the end of +the file +```bash +Branch/iter = 3.94 (millisecs) +``` +Here `3.94` miiliseconds will be the input for the `34K` batch size in Figure 5. + +### Figure 6 + +```bash +$ ./figure6.sh +``` +It will generate `output_gpu${j}_casename.txt` file for each `casename` where `j` represents the number of GPUs +used. Near the end of the file, you will see the timing results: `[0] (Br+MPI)/iter = %.2f (millisecs)` is the relevant result, +where `[0]` represents the rank (the root in this case) of a process. +For example, in order to obtain timing results for `case19402_goc` with 6 GPUs, we read the following line around the end of the file +`output_gpu6_case19402_goc.txt` +```bash +[0] (Br+MPI)/iter = 0.79 (millisecs) +``` +The speedup is `3.94/0.79 = 4.98` in this case. In this way, you can reproduce Figure 6. + +### Table 5 + +```bash +$ ./table5.sh branch_time_file +``` +where `branch_time_file` corresponds to the file containing the computation time of branch of each GPU. +It is generated from `figure6.sh`. For example, `figure6.sh` will generate the following files: +```bash +br_time_gpu6_case2868rte.txt +br_time_gpu6_case6515rte.txt +br_time_gpu6_case9241pegase.txt +br_time_gpu6_case13659pegase.txt +br_time_gpu6_case19402_goc.txt +``` +The following command will give you the load imbalance statistics for `case13659pegase`: +```bash +$ ./table5.sh br_time_gpu6_case13659pegase.txt +``` +Similarly, you can reproduce load imbalance statistics for other case files. + +### Figure 7 + +```bash +$ ./figure7.sh branch_time_file +``` + +The usage is the same as `table5.sh`. We use the same branch computation file. +To reproduce Figure 7, you need to use the file for `case13659pegase`: +```bash +$ ./figure7.sh br_time_gpu6_case13659pegase.txt +``` +It will generate `br_time_gpu6_case13659pegase.pdf`. The file should be similar to Figure 7. + +### Figure 8 + +```bash +$ ./figure8.sh +``` + +This script will run ExaTron.jl using 40 CPU cores. It will generate output files named `output_cpu40_casename.txt`. +Each file contains timing results for each case. For example, if you want to read the timing results for `case19402_goc`, +we read the following line around the end of the file. +```bash +[0] (Br+MPI)/iter = 30.03 (milliseconds) +``` +Here `30.03` will be the input for `case19402_goc` for CPUs in Figure 8. For 6 GPUs, we use the results from `figure6.sh`. ## Citing this package From fad55a18d131e460c5b9e2fc0bb7c8acb928c130 Mon Sep 17 00:00:00 2001 From: Youngdae Kim Date: Fri, 4 Jun 2021 19:08:36 -0400 Subject: [PATCH 4/5] fixes numbers. --- figure6.sh | 2 +- figure8.sh | 2 +- table5.sh | 15 +++++++++++---- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/figure6.sh b/figure6.sh index c0831f2..a92f51f 100755 --- a/figure6.sh +++ b/figure6.sh @@ -24,7 +24,7 @@ export JULIA_MPI_BINARY="system" DATA=("case2868rte" "case6515rte" "case9241pegase" "case13659pegase" "case19402_goc") PQ=(10 20 50 50 500) VA=(1000 2000 5000 5000 50000) -ITER=(6000 15000 35000 45000 30000) +ITER=(5648 13651 30927 41126 28358) NGPU=(2 3 4 5 6) for j in ${!NGPU[@]}; do diff --git a/figure8.sh b/figure8.sh index e11f128..665cf09 100755 --- a/figure8.sh +++ b/figure8.sh @@ -24,7 +24,7 @@ export JULIA_MPI_BINARY="system" DATA=("case2868rte" "case6515rte" "case9241pegase" "case13659pegase" "case19402_goc") PQ=(10 20 50 50 500) VA=(1000 2000 5000 5000 50000) -ITER=(6000 15000 35000 45000 30000) +ITER=(5718 13640 30932 41140 28358) for i in ${!DATA[@]}; do mpirun -np 40 julia --project ./src/launch_mpi.jl "./data/${DATA[$i]}" ${PQ[$i]} ${VA[$i]} ${ITER[$i]} false > output_cpu40_${DATA[$i]}.txt 2>&1 diff --git a/table5.sh b/table5.sh index 099c06b..2ae1ec5 100755 --- a/table5.sh +++ b/table5.sh @@ -8,7 +8,14 @@ export JULIA_CUDA_VERBOSE=1 export JULIA_MPI_BINARY="system" -DATA=("2868rte" "6515rte" "9241pegase" "13659pegase" "19402goc") -for i in ${!DATA[@]}; do - julia --project ./src/load_imbalance.jl "./br_time_gpu_${DATA[$i]}.txt" -done +function usage() { + echo "Usage: ./table5.sh case" + echo " case: the case file containing branch computation time of each GPU" +} + +if [[ $# != 1 ]]; then + usage + exit +fi + +julia --project ./src/load_imbalance.jl $1 From fbb4d7c3ca7c257c7aa343243653931696e37254 Mon Sep 17 00:00:00 2001 From: Youngdae Kim Date: Fri, 4 Jun 2021 21:23:14 -0500 Subject: [PATCH 5/5] displays progress and fixes index bug. --- figure5.sh | 3 ++- figure6.sh | 7 ++++--- figure8.sh | 3 ++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/figure5.sh b/figure5.sh index 43eb38a..3125bb2 100755 --- a/figure5.sh +++ b/figure5.sh @@ -26,6 +26,7 @@ VA=(1000 2000 5000 5000 50000) ITER=(6000 15000 35000 45000 30000) for i in ${!DATA[@]}; do - julia --project ./src/admm_standalone.jl "./data/${DATA[$i]}" ${PQ[$i]} ${VA[$i]} ${ITER[$i]} true > output_gpu1_${DATA[$i]}.txt 2>&1 + echo "Solving ${DATA[$i]} . . ." + julia --project ./src/admm_standalone.jl "./data/${DATA[$i]}" ${PQ[$i]} ${VA[$i]} ${ITER[$i]} true > output_gpu1_${DATA[$i]}.txt 2>&1 done diff --git a/figure6.sh b/figure6.sh index a92f51f..182fae0 100755 --- a/figure6.sh +++ b/figure6.sh @@ -28,8 +28,9 @@ ITER=(5648 13651 30927 41126 28358) NGPU=(2 3 4 5 6) for j in ${!NGPU[@]}; do - for i in ${!DATA[@]}; do - mpirun -np ${j} julia --project ./src/launch_mpi.jl "./data/${DATA[$i]}" ${PQ[$i]} ${VA[$i]} ${ITER[$i]} true > output_gpu${j}_${DATA[$i]}.txt 2>&1 - mv br_time_gpu.txt br_time_gpu${j}_${DATA[$i]}.txt + for i in ${!DATA[@]}; do + echo "Solving ${DATA[$i]} using ${NGPU[$j]} GPUs . . ." + mpirun -np ${NGPU[$j]} julia --project ./src/launch_mpi.jl "./data/${DATA[$i]}" ${PQ[$i]} ${VA[$i]} ${ITER[$i]} true > output_gpu${NGPU[$j]}_${DATA[$i]}.txt 2>&1 + mv br_time_gpu.txt br_time_gpu${NGPU[$j]}_${DATA[$i]}.txt done done diff --git a/figure8.sh b/figure8.sh index 665cf09..2fa71ca 100755 --- a/figure8.sh +++ b/figure8.sh @@ -27,5 +27,6 @@ VA=(1000 2000 5000 5000 50000) ITER=(5718 13640 30932 41140 28358) for i in ${!DATA[@]}; do - mpirun -np 40 julia --project ./src/launch_mpi.jl "./data/${DATA[$i]}" ${PQ[$i]} ${VA[$i]} ${ITER[$i]} false > output_cpu40_${DATA[$i]}.txt 2>&1 + echo "Solving ${DATA[$i]} using 40 CPU cores . . ." + mpirun -np 40 julia --project ./src/launch_mpi.jl "./data/${DATA[$i]}" ${PQ[$i]} ${VA[$i]} ${ITER[$i]} false > output_cpu40_${DATA[$i]}.txt 2>&1 done