class ServerScripts::BatchJob

Attributes

additional_commands[RW]
enable_intel_itac[RW]
env[R]
err_file[RW]
executable[RW]
executor[RW]
intel_vtune_fname[RW]
job_fname[R]
job_name[RW]
modules[RW]
node_type[RW]
nodes[RW]
npernode[RW]
nprocs[RW]
options[RW]
out_file[RW]
reservation_id[RW]
run_cmd[RW]
source_bashrc[RW]
system[R]
wall_time[RW]

Public Class Methods

new(job_fname="sample_job.sh") { |self| ... } click to toggle source
# File lib/server_scripts/batch_job.rb, line 24
def initialize job_fname="sample_job.sh"
  @job_fname = job_fname
  @job_name = "sample"
  @out_file = "sample_out.log"
  @err_file = "sample_err.log"
  @wall_time = "1:00:00"
  @node_type = NodeType::FULL
  @nodes = 1
  @npernode = 1
  @nprocs = nil
  @run_cmd = nil
  @executor = :vanilla
  @env = {}
  @executable = "./a.out"
  @job_script = nil
  @enable_intel_itac = false
  @additional_commands = []
  @modules = []
  @source_bashrc = true
  @reservation_id = nil

  yield self
end

Public Instance Methods

set_env(var, value) click to toggle source
# File lib/server_scripts/batch_job.rb, line 48
def set_env var, value
  raise ArgumentError, "Env #{var} is already set to #{value}." if @env[var]
  @env[var] = value
end
submit!() click to toggle source
# File lib/server_scripts/batch_job.rb, line 58
def submit!
  write_job_script!
  Kernel.system(@system.job_submit_cmd(
    batch_script: @job_fname,
    res_id: @reservation_id))
end
write_job_script!() click to toggle source
# File lib/server_scripts/batch_job.rb, line 53
def write_job_script!
  generate_job_script! unless @job_script
  File.write(@job_fname, @job_script)      
end

Private Instance Methods

check_process_counts() click to toggle source
# File lib/server_scripts/batch_job.rb, line 101
def check_process_counts
  if @nprocs && @nprocs != @npernode * @nodes
    raise ArgumentError, "Number of processes should be #{@npernode * @nodes} not #{@nprocs}"
  end
end
configure_executor!() click to toggle source
# File lib/server_scripts/batch_job.rb, line 84
def configure_executor!
  check_process_counts
  @nprocs = @npernode * @nodes

  if @executor == :openmpi
    @executor = Executor::OpenMPI.new(npernode: @npernode, nprocs: @nprocs, env: @env)
  elsif @executor == :intel
    @executor = Executor::IntelMPI.new(npernode: @npernode, nprocs: @nprocs, env: @env)
    @executor.enable_itac = !!@enable_intel_itac
    @executor.vtune_fname = @intel_vtune_fname
  elsif @executor == :vanilla
    @executor = Executor::Vanilla.new
  else
    raise ArgumentError, "Cannot find MPI implementation #{@executor}."
  end
end
generate_job_script!() click to toggle source
# File lib/server_scripts/batch_job.rb, line 67
def generate_job_script!
  @system = ServerScripts.system.new(@node_type, @nodes, @job_name,
    @wall_time, @out_file, @err_file, @env, @modules)
  configure_executor!

  @job_script = ""
  @job_script += @system.header
  @job_script += "\nsource ~/.bashrc\n" if @source_bashrc
  @job_script += @system.module_load_cmd

  @job_script += @system.env_setter
  @additional_commands.each do |c|
    @job_script += c + "\n"
  end
  @job_script += "#{@executor.run_cmd} #{@executable} #{@options}\n"
end