server_scripts 0.0.5 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/server_scripts.rb +4 -102
- data/lib/server_scripts/batch_job.rb +107 -0
- data/lib/server_scripts/experiment.rb +17 -0
- data/lib/server_scripts/parser/itac.rb +125 -5
- data/lib/server_scripts/parser/starpu_profile.rb +64 -23
- data/lib/server_scripts/version.rb +1 -1
- data/server_scripts.gemspec +2 -0
- metadata +18 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0d900565278f9df7242f33d23a8b8e22ee67429a
|
4
|
+
data.tar.gz: 6deaa6599e7bc742ebcabeee802ea699f9f9d44f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 685af965add627451c130b29c557d13c3231e6b94730c2d2dfe7882027492d15933a353002978f3df5137222a19eccc7656d5c7307771f866f3ea820de22b411
|
7
|
+
data.tar.gz: 9f5c6cd9efd59294f7e8a430be9fa4abd99989a67c6591486dcdf735a9da33d549e5b1671371b2b7073eeacd34c4020da3d280a3485c784e3be96914ba3a835d
|
data/lib/server_scripts.rb
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
+
require 'ptools'
|
3
|
+
|
2
4
|
require 'server_scripts/node_type'
|
3
5
|
require 'server_scripts/executor'
|
4
6
|
require 'server_scripts/computer'
|
5
7
|
require 'server_scripts/parser'
|
8
|
+
require 'server_scripts/experiment'
|
9
|
+
require 'server_scripts/batch_job'
|
6
10
|
require 'server_scripts/version'
|
7
11
|
|
8
12
|
module ServerScripts
|
@@ -25,108 +29,6 @@ module ServerScripts
|
|
25
29
|
ENV["GROUP_NAME"]
|
26
30
|
end
|
27
31
|
end
|
28
|
-
|
29
|
-
class BatchJob
|
30
|
-
attr_accessor :job_name
|
31
|
-
attr_accessor :out_file
|
32
|
-
attr_accessor :err_file
|
33
|
-
attr_accessor :wall_time
|
34
|
-
attr_accessor :node_type
|
35
|
-
attr_accessor :options
|
36
|
-
attr_accessor :nodes
|
37
|
-
attr_accessor :npernode
|
38
|
-
attr_accessor :nprocs
|
39
|
-
attr_accessor :run_cmd, :executor, :executable
|
40
|
-
attr_accessor :additional_commands
|
41
|
-
attr_accessor :enable_intel_itac
|
42
|
-
attr_accessor :intel_vtune_fname
|
43
|
-
attr_accessor :source_bashrc
|
44
|
-
attr_accessor :modules
|
45
|
-
|
46
|
-
attr_reader :env
|
47
|
-
attr_reader :job_fname
|
48
|
-
attr_reader :system
|
49
|
-
|
50
|
-
def initialize job_fname
|
51
|
-
@job_fname = job_fname
|
52
|
-
@job_name = "sample"
|
53
|
-
@out_file = "sample_out.log"
|
54
|
-
@err_file = "sample_err.log"
|
55
|
-
@wall_time = "1:00:00"
|
56
|
-
@node_type = NodeType::FULL
|
57
|
-
@nodes = 1
|
58
|
-
@npernode = 1
|
59
|
-
@nprocs = nil
|
60
|
-
@run_cmd = nil
|
61
|
-
@executor = :vanilla
|
62
|
-
@env = {}
|
63
|
-
@executable = "./a.out"
|
64
|
-
@job_script = nil
|
65
|
-
@enable_intel_itac = false
|
66
|
-
@additional_commands = []
|
67
|
-
@modules = []
|
68
|
-
@source_bashrc = true
|
69
|
-
|
70
|
-
yield self
|
71
|
-
end
|
72
|
-
|
73
|
-
def set_env var, value
|
74
|
-
raise ArgumentError, "Env #{var} is already set to #{value}." if @env[var]
|
75
|
-
@env[var] = value
|
76
|
-
end
|
77
|
-
|
78
|
-
def write_job_script!
|
79
|
-
generate_job_script! unless @job_script
|
80
|
-
File.write(@job_fname, @job_script)
|
81
|
-
end
|
82
|
-
|
83
|
-
def submit!
|
84
|
-
write_job_script!
|
85
|
-
Kernel.system(@system.job_submit_cmd(batch_script: @job_fname))
|
86
|
-
end
|
87
|
-
|
88
|
-
private
|
89
|
-
|
90
|
-
def generate_job_script!
|
91
|
-
@system = ServerScripts.system.new(@node_type, @nodes, @job_name,
|
92
|
-
@wall_time, @out_file, @err_file, @env, @modules)
|
93
|
-
configure_executor!
|
94
|
-
|
95
|
-
@job_script = ""
|
96
|
-
@job_script += @system.header
|
97
|
-
@job_script += "\nsource ~/.bashrc\n" if @source_bashrc
|
98
|
-
@job_script += @system.module_load_cmd
|
99
|
-
|
100
|
-
@job_script += @system.env_setter
|
101
|
-
@additional_commands.each do |c|
|
102
|
-
@job_script += c + "\n"
|
103
|
-
end
|
104
|
-
@job_script += "#{@executor.run_cmd} #{@executable} #{@options}\n"
|
105
|
-
end
|
106
|
-
|
107
|
-
def configure_executor!
|
108
|
-
check_process_counts
|
109
|
-
@nprocs = @npernode * @nodes
|
110
|
-
|
111
|
-
if @executor == :openmpi
|
112
|
-
@executor = Executor::OpenMPI.new(npernode: @npernode, nprocs: @nprocs, env: @env)
|
113
|
-
elsif @executor == :intel
|
114
|
-
@executor = Executor::IntelMPI.new(npernode: @npernode, nprocs: @nprocs, env: @env)
|
115
|
-
@executor.enable_itac = !!@enable_intel_itac
|
116
|
-
@executor.vtune_fname = @intel_vtune_fname
|
117
|
-
elsif @executor == :vanilla
|
118
|
-
@executor = Executor::Vanilla.new
|
119
|
-
else
|
120
|
-
raise ArgumentError, "Cannot find MPI implementation #{@executor}."
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
def check_process_counts
|
125
|
-
if @nprocs && @nprocs != @npernode * @nodes
|
126
|
-
raise ArgumentError, "Number of processes should be #{@npernode * @nodes} not #{@nprocs}"
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|
130
32
|
end # module ServerScripts
|
131
33
|
|
132
34
|
|
@@ -0,0 +1,107 @@
|
|
1
|
+
module ServerScripts
|
2
|
+
class BatchJob
|
3
|
+
attr_accessor :job_name
|
4
|
+
attr_accessor :out_file
|
5
|
+
attr_accessor :err_file
|
6
|
+
attr_accessor :wall_time
|
7
|
+
attr_accessor :node_type
|
8
|
+
attr_accessor :options
|
9
|
+
attr_accessor :nodes
|
10
|
+
attr_accessor :npernode
|
11
|
+
attr_accessor :nprocs
|
12
|
+
attr_accessor :run_cmd, :executor, :executable
|
13
|
+
attr_accessor :additional_commands
|
14
|
+
attr_accessor :enable_intel_itac
|
15
|
+
attr_accessor :intel_vtune_fname
|
16
|
+
attr_accessor :source_bashrc
|
17
|
+
attr_accessor :modules
|
18
|
+
attr_accessor :reservation_id
|
19
|
+
|
20
|
+
attr_reader :env
|
21
|
+
attr_reader :job_fname
|
22
|
+
attr_reader :system
|
23
|
+
|
24
|
+
def initialize job_fname="sample_job.sh"
|
25
|
+
@job_fname = job_fname
|
26
|
+
@job_name = "sample"
|
27
|
+
@out_file = "sample_out.log"
|
28
|
+
@err_file = "sample_err.log"
|
29
|
+
@wall_time = "1:00:00"
|
30
|
+
@node_type = NodeType::FULL
|
31
|
+
@nodes = 1
|
32
|
+
@npernode = 1
|
33
|
+
@nprocs = nil
|
34
|
+
@run_cmd = nil
|
35
|
+
@executor = :vanilla
|
36
|
+
@env = {}
|
37
|
+
@executable = "./a.out"
|
38
|
+
@job_script = nil
|
39
|
+
@enable_intel_itac = false
|
40
|
+
@additional_commands = []
|
41
|
+
@modules = []
|
42
|
+
@source_bashrc = true
|
43
|
+
@reservation_id = nil
|
44
|
+
|
45
|
+
yield self
|
46
|
+
end
|
47
|
+
|
48
|
+
def set_env var, value
|
49
|
+
raise ArgumentError, "Env #{var} is already set to #{value}." if @env[var]
|
50
|
+
@env[var] = value
|
51
|
+
end
|
52
|
+
|
53
|
+
def write_job_script!
|
54
|
+
generate_job_script! unless @job_script
|
55
|
+
File.write(@job_fname, @job_script)
|
56
|
+
end
|
57
|
+
|
58
|
+
def submit!
|
59
|
+
write_job_script!
|
60
|
+
Kernel.system(@system.job_submit_cmd(
|
61
|
+
batch_script: @job_fname,
|
62
|
+
res_id: @reservation_id))
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
def generate_job_script!
|
68
|
+
@system = ServerScripts.system.new(@node_type, @nodes, @job_name,
|
69
|
+
@wall_time, @out_file, @err_file, @env, @modules)
|
70
|
+
configure_executor!
|
71
|
+
|
72
|
+
@job_script = ""
|
73
|
+
@job_script += @system.header
|
74
|
+
@job_script += "\nsource ~/.bashrc\n" if @source_bashrc
|
75
|
+
@job_script += @system.module_load_cmd
|
76
|
+
|
77
|
+
@job_script += @system.env_setter
|
78
|
+
@additional_commands.each do |c|
|
79
|
+
@job_script += c + "\n"
|
80
|
+
end
|
81
|
+
@job_script += "#{@executor.run_cmd} #{@executable} #{@options}\n"
|
82
|
+
end
|
83
|
+
|
84
|
+
def configure_executor!
|
85
|
+
check_process_counts
|
86
|
+
@nprocs = @npernode * @nodes
|
87
|
+
|
88
|
+
if @executor == :openmpi
|
89
|
+
@executor = Executor::OpenMPI.new(npernode: @npernode, nprocs: @nprocs, env: @env)
|
90
|
+
elsif @executor == :intel
|
91
|
+
@executor = Executor::IntelMPI.new(npernode: @npernode, nprocs: @nprocs, env: @env)
|
92
|
+
@executor.enable_itac = !!@enable_intel_itac
|
93
|
+
@executor.vtune_fname = @intel_vtune_fname
|
94
|
+
elsif @executor == :vanilla
|
95
|
+
@executor = Executor::Vanilla.new
|
96
|
+
else
|
97
|
+
raise ArgumentError, "Cannot find MPI implementation #{@executor}."
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def check_process_counts
|
102
|
+
if @nprocs && @nprocs != @npernode * @nodes
|
103
|
+
raise ArgumentError, "Number of processes should be #{@npernode * @nodes} not #{@nprocs}"
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module ServerScripts
|
2
|
+
# Class that represents an experiment that needs to be conducted. Accepts
|
3
|
+
# various parameters that need to be tested and a BatchJob object which it
|
4
|
+
# customize depending on the test parameters.
|
5
|
+
class Experiment
|
6
|
+
attr_accessor :batch_job
|
7
|
+
attr_accessor :exp_params
|
8
|
+
attr_accessor :job_params
|
9
|
+
attr_accessor :executable
|
10
|
+
|
11
|
+
def initialize exp_name
|
12
|
+
@exp_name = exp_name
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
end # class Experiment
|
17
|
+
end # module ServerScripts
|
@@ -1,16 +1,136 @@
|
|
1
1
|
module ServerScripts
|
2
2
|
module Parser
|
3
3
|
class ITAC
|
4
|
-
|
4
|
+
attr_accessor :real_itac_fname
|
5
|
+
attr_reader :ideal_itac_fname
|
5
6
|
|
6
7
|
def initialize itac_file
|
7
|
-
|
8
|
-
|
9
|
-
@
|
8
|
+
check_for_traceanalyzer
|
9
|
+
|
10
|
+
@real_itac_fname = itac_file
|
11
|
+
@ideal_itac_fname = "#{@real_itac_fname}.ideal.single.stf"
|
12
|
+
@real_function_profile = nil
|
13
|
+
@ideal_function_profile = nil
|
14
|
+
|
15
|
+
yield self if block_given?
|
16
|
+
end
|
17
|
+
|
18
|
+
def trace!
|
19
|
+
generate_ideal_trace!
|
20
|
+
analyze_function_profiles!
|
10
21
|
end
|
11
22
|
|
12
23
|
def generate_ideal_trace!
|
13
|
-
|
24
|
+
unless File.file?(@ideal_itac_fname)
|
25
|
+
Kernel.system(
|
26
|
+
"traceanalyzer --cli --ideal -u -o #{@ideal_itac_fname} #{@real_itac_fname}")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def analyze_function_profiles!
|
31
|
+
unless @real_function_profile
|
32
|
+
@real_function_profile = `traceanalyzer --cli --functionprofile #{@real_itac_fname}`
|
33
|
+
@real_function_profile = @real_function_profile.split("\n")
|
34
|
+
end
|
35
|
+
unless @ideal_function_profile
|
36
|
+
@ideal_function_profile = `traceanalyzer --cli --functionprofile #{@ideal_itac_fname}`
|
37
|
+
@ideal_function_profile = @ideal_function_profile.split("\n")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Total time of real execution including intialization etc.
|
42
|
+
def real_app_time
|
43
|
+
@total_app_time ||= event_time("Application", kind: :real, how: :all_procs)
|
44
|
+
@total_app_time
|
45
|
+
end
|
46
|
+
|
47
|
+
# Ideal MPI time. Only wait time.
|
48
|
+
def ideal_mpi_time
|
49
|
+
@ideal_mpi_time ||= event_time("MPI", kind: :ideal)
|
50
|
+
@ideal_mpi_time
|
51
|
+
end
|
52
|
+
|
53
|
+
# Actual MPI time. Includes wait time and communication time.
|
54
|
+
def real_mpi_time
|
55
|
+
@real_mpi_time ||= event_time("MPI")
|
56
|
+
@real_mpi_time
|
57
|
+
end
|
58
|
+
|
59
|
+
# Time that MPI spent in communication.
|
60
|
+
def mpi_comm_time
|
61
|
+
real_mpi_time - ideal_mpi_time
|
62
|
+
end
|
63
|
+
|
64
|
+
# Get event time for a particular event. Specify whether from ideal trace or real trace.
|
65
|
+
def event_time(event, kind: :real, how: :all_procs)
|
66
|
+
if kind == :real
|
67
|
+
parse_real_event_time(event, how: how)
|
68
|
+
elsif kind == :ideal
|
69
|
+
parse_ideal_event_time(event, how: how)
|
70
|
+
else
|
71
|
+
raise ArgumentError, "kind argument should be either :real or :ideal, not #{kind}."
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
private
|
76
|
+
|
77
|
+
def get_allprocs_event_time(func_profile, event)
|
78
|
+
regex_event = Regexp.quote(event)
|
79
|
+
event_time = nil
|
80
|
+
func_profile.each do |l|
|
81
|
+
if l.match(/"All_Processes";"#{regex_event}"/)
|
82
|
+
match_data = l.match /"All_Processes";"#{regex_event}";(\d+);(\d+);(\d+);(\d+)/
|
83
|
+
event_time = match_data[2].to_f / 1e9
|
84
|
+
break
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
unless event_time
|
89
|
+
raise RuntimeError, "no event #{event} could be found in the function profile"
|
90
|
+
end
|
91
|
+
|
92
|
+
event_time
|
93
|
+
end
|
94
|
+
|
95
|
+
def get_perproc_event_time(func_profile, event)
|
96
|
+
regex_event = Regexp.quote(event)
|
97
|
+
per_proc_event_time = {}
|
98
|
+
|
99
|
+
func_profile.each do |l|
|
100
|
+
if l.match(/"Process\s(\d+)";"#{regex_event}"/)
|
101
|
+
match_data = l.match(/"Process\s(\d+)";"#{regex_event}";(\d+);(\d+);(\d+);(\d+)/)
|
102
|
+
per_proc_event_time[match_data[1].to_i] = match_data[3].to_f / 1e9
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
values = per_proc_event_time.values
|
107
|
+
[values.inject(:+).to_f / values.size, values.min, values.max]
|
108
|
+
end
|
109
|
+
|
110
|
+
def parse_real_event_time(event, how:)
|
111
|
+
if how == :all_procs
|
112
|
+
get_allprocs_event_time(@real_function_profile, event)
|
113
|
+
elsif how == :per_proc
|
114
|
+
get_perproc_event_time(@real_function_profile, event)
|
115
|
+
else
|
116
|
+
raise ArgumentError, "how argument should be either :all_procs or :per_proc, not #{how}."
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def parse_ideal_event_time(event, how:)
|
121
|
+
if how == :all_procs
|
122
|
+
get_allprocs_event_time(@ideal_function_profile, event)
|
123
|
+
elsif how == :per_proc
|
124
|
+
get_perproc_event_time(@ideal_function_profile, event)
|
125
|
+
else
|
126
|
+
raise ArgumentError, "how argument should be either :all_procs or :per_proc, not #{how}."
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def check_for_traceanalyzer
|
131
|
+
unless File.which("traceanalyzer")
|
132
|
+
raise RuntimeError, "Must have intel traceanalyzer executable installed."
|
133
|
+
end
|
14
134
|
end
|
15
135
|
end # class ITAC
|
16
136
|
end
|
@@ -1,48 +1,89 @@
|
|
1
1
|
module ServerScripts
|
2
2
|
module Parser
|
3
3
|
class StarpuProfile
|
4
|
-
|
5
|
-
attr_reader :
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
|
5
|
+
attr_reader :time_hash
|
6
|
+
# Specify the regex that will allow finding the profile files for the given starpu
|
7
|
+
# processes. Each process will output one file.
|
8
|
+
#
|
9
|
+
# Usage:
|
10
|
+
# parser = Parser::StarpuProfile.new("4_proc_profile_1_*.starpu_profile")
|
11
|
+
# parser.total_time
|
9
12
|
def initialize regex
|
10
13
|
@regex = regex
|
11
|
-
@
|
12
|
-
@total_exec_time = 0.0
|
13
|
-
@total_sleep_time = 0.0
|
14
|
-
@total_overhead_time = 0.0
|
15
|
-
|
14
|
+
@time_hash = {}
|
16
15
|
extract_data_from_profiles
|
17
16
|
end
|
18
17
|
|
18
|
+
def total_time
|
19
|
+
extract_from_time_hash :total_time
|
20
|
+
end
|
21
|
+
|
22
|
+
def total_exec_time
|
23
|
+
extract_from_time_hash :exec_time
|
24
|
+
end
|
25
|
+
|
26
|
+
def total_sleep_time
|
27
|
+
extract_from_time_hash :sleep_time
|
28
|
+
end
|
29
|
+
|
30
|
+
def total_overhead_time
|
31
|
+
extract_from_time_hash :overhead_time
|
32
|
+
end
|
33
|
+
|
34
|
+
def proc_time event:, proc_id:
|
35
|
+
time = 0.0
|
36
|
+
@time_hash[proc_id].each_value do |thread_info|
|
37
|
+
time += thread_info[event]
|
38
|
+
end
|
39
|
+
|
40
|
+
time
|
41
|
+
end
|
42
|
+
|
43
|
+
def time event:, proc_id:, worker_id:
|
44
|
+
@time_hash[proc_id][worker_id][event]
|
45
|
+
end
|
46
|
+
|
19
47
|
private
|
20
48
|
|
49
|
+
def extract_from_time_hash key
|
50
|
+
time = 0.0
|
51
|
+
|
52
|
+
@time_hash.each_value do |proc_time|
|
53
|
+
proc_time.each_value do |thread_time|
|
54
|
+
time += thread_time[key]
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
time
|
59
|
+
end
|
60
|
+
|
21
61
|
def extract_data_from_profiles
|
22
62
|
Dir.glob(@regex) do |fname|
|
63
|
+
proc_id = fname.match(@regex.gsub("*", "(\\d+)"))[1].to_i
|
64
|
+
@time_hash[proc_id] = {}
|
23
65
|
output = File.read(fname).split("\n")
|
24
|
-
|
66
|
+
recent_cpu = nil
|
67
|
+
|
25
68
|
output.each do |line|
|
69
|
+
cpu_match = line.match(/CPU\s(\d+)/)
|
70
|
+
recent_cpu = cpu_match[1].to_i if cpu_match
|
26
71
|
match_data = line.match(/total\:\s+(\d+)\.\d+\sms\sexecuting\:\s(\d+).\d+\sms\ssleeping\:\s(\d+).\d+\sms\soverhead\s(\d+).\d+\sms/)
|
27
72
|
|
28
73
|
if match_data
|
29
74
|
exec_time = match_data[2].to_i
|
30
|
-
|
31
75
|
if exec_time != 0
|
32
|
-
@
|
33
|
-
@
|
34
|
-
@
|
35
|
-
@
|
76
|
+
@time_hash[proc_id][recent_cpu] = {}
|
77
|
+
@time_hash[proc_id][recent_cpu][:total_time] = match_data[1].to_f / 1e3
|
78
|
+
@time_hash[proc_id][recent_cpu][:exec_time] = match_data[2].to_f / 1e3
|
79
|
+
@time_hash[proc_id][recent_cpu][:sleep_time] = match_data[3].to_f / 1e3
|
80
|
+
@time_hash[proc_id][recent_cpu][:overhead_time] = match_data[4].to_f / 1e3
|
36
81
|
end
|
82
|
+
recent_cpu = nil
|
37
83
|
end
|
38
84
|
end
|
39
85
|
end
|
40
|
-
|
41
|
-
@total_time /= 1e3
|
42
|
-
@total_exec_time /= 1e3
|
43
|
-
@total_sleep_time /= 1e3
|
44
|
-
@total_overhead_time /= 1e3
|
45
86
|
end
|
46
|
-
end
|
47
|
-
end
|
87
|
+
end # class
|
88
|
+
end # module Parser
|
48
89
|
end # module StarpuProfile
|
data/server_scripts.gemspec
CHANGED
@@ -35,6 +35,8 @@ Gem::Specification.new do |spec|
|
|
35
35
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
36
36
|
spec.require_paths = ["lib"]
|
37
37
|
|
38
|
+
spec.add_runtime_dependency 'ptools'
|
39
|
+
|
38
40
|
spec.add_development_dependency 'minitest', '~> 5.11'
|
39
41
|
spec.add_development_dependency 'minitest-hooks'
|
40
42
|
spec.add_development_dependency 'minitest-fail-fast'
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: server_scripts
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sameer Deshmukh
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-01-
|
11
|
+
date: 2020-01-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: ptools
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: minitest
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -65,6 +79,7 @@ files:
|
|
65
79
|
- README.md
|
66
80
|
- Rakefile
|
67
81
|
- lib/server_scripts.rb
|
82
|
+
- lib/server_scripts/batch_job.rb
|
68
83
|
- lib/server_scripts/computer.rb
|
69
84
|
- lib/server_scripts/computer/abci.rb
|
70
85
|
- lib/server_scripts/computer/base.rb
|
@@ -75,6 +90,7 @@ files:
|
|
75
90
|
- lib/server_scripts/executor/mpi_program.rb
|
76
91
|
- lib/server_scripts/executor/valgrind.rb
|
77
92
|
- lib/server_scripts/executor/vanilla.rb
|
93
|
+
- lib/server_scripts/experiment.rb
|
78
94
|
- lib/server_scripts/node_type.rb
|
79
95
|
- lib/server_scripts/parser.rb
|
80
96
|
- lib/server_scripts/parser/itac.rb
|