| #!/usr/bin/env expect |
| ############################################################################ |
| # Purpose: Test --hint mutual exclusive properties |
| ############################################################################ |
| # Copyright (C) SchedMD LLC. |
| # |
| # This file is part of Slurm, a resource management program. |
| # For details, see <https://slurm.schedmd.com/>. |
| # Please also read the included file: DISCLAIMER. |
| # |
| # Slurm is free software; you can redistribute it and/or modify it under |
| # the terms of the GNU General Public License as published by the Free |
| # Software Foundation; either version 2 of the License, or (at your option) |
| # any later version. |
| # |
| # Slurm is distributed in the hope that it will be useful, but WITHOUT ANY |
| # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
| # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more |
| # details. |
| # |
| # You should have received a copy of the GNU General Public License along |
| # with Slurm; if not, write to the Free Software Foundation, Inc., |
| # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
| ############################################################################ |
| source ./globals |
| |
| set job_id 0 |
| |
| |
| proc cleanup {} { |
| global job_id |
| |
| cancel_job $job_id |
| } |
| |
| |
| proc check_error {client option prog error} { |
| global sbatch salloc srun test_name number job_id |
| |
| set cmd "$client -v -H -J$test_name -t1 --hint=nomultithread $option $prog" |
| set job_id 0 |
| set matches 0 |
| spawn {*}$cmd |
| expect { |
| -ex "$error" { |
| incr matches |
| exp_continue |
| } |
| -re "job ($number)" { |
| set job_id $expect_out(1,string) |
| } |
| timeout { |
| fail "[file tail $client] not responding" |
| } |
| eof { |
| wait |
| } |
| } |
| subtest {$matches == 1} "Submission should return '$error'" |
| cancel_job $job_id |
| } |
| |
| |
| proc mutual_error_tests {} { |
| global sbatch salloc srun test_name number job_id |
| |
| set clients [list "$sbatch" "$salloc" "$srun"] |
| set options [list "--threads-per-core=1" "--ntasks-per-core=1" "-B1"] |
| set error "Following options are mutually exclusive with --hint: --ntasks-per-core, --cores-per-socket, --threads-per-core, --sockets-per-node, -B and --cpu-bind (other than --cpu-bind=verbose). Ignoring --hint." |
| |
| foreach client $clients { |
| set prog "hostname" |
| if {$client == $sbatch} { |
| set prog "--wrap=hostname" |
| } |
| foreach option $options { |
| check_error $client $option $prog $error |
| } |
| } |
| |
| # Test srun --hint only with works with --cpu-bind=verbose |
| set client $srun |
| set options [list "--cpu-bind=threads" "--cpu-bind=threads,verbose"] |
| foreach option $options { |
| check_error $client $option "hostname" $error |
| } |
| |
| # Test if srun --cpu-bind=verbose --hint=nomultithread actually enabled cpu-bind |
| set output [run_command_output -subtest "$srun --hint=nomultithread --cpu-bind=verbose /bin/true"] |
| subtest {[regexp "cpu-bind=" $output]} "The output should contain line starting with cpu-bind=, indicating that --cpu-bind=verbose is in effect" |
| } |
| |
| mutual_error_tests |
| |
| # Test SLURM_HINT env variable |
| set env(SLURM_HINT) "nomultithread" |
| mutual_error_tests |
| |
| # Options are given a higher precedence than the environment. Options that conflict |
| # with the environment cause the conflicting environment variables to be overridden. |
| # Thus, when --ntasks-per-core or --threads-per-core options are specified |
| # in conjunction with SLURM_HINT, since these conflict, the SLURM_HINT is ignored. |
| |
| # We will use 2 threads per core and tasks per core if available in order to |
| # demonstrate that the nomultithread hint is being ignored. |
| set node_name [get_nodes_by_request "--ntasks-per-core=2 -t1"] |
| set threads_per_core [expr [get_node_param $node_name "ThreadsPerCore"] > 1 ? 2 : 1] |
| |
| set client "$sbatch" |
| set prog "--wrap=hostname" |
| set options [list "--threads-per-core=$threads_per_core --ntasks-per-core=$threads_per_core"] |
| foreach option $options { |
| set cmd "$client -w $node_name -v -H -J$test_name -t1 $option $prog" |
| |
| set job_id 0 |
| set matches 0 |
| spawn {*}$cmd |
| expect { |
| "mutually exclusive" { |
| incr matches |
| exp_continue |
| } |
| -re "job ($number)" { |
| set job_id $expect_out(1,string) |
| } |
| timeout { |
| fail "[file tail $client] not responding" |
| } |
| eof { |
| wait |
| } |
| } |
| subtest {$job_id != 0} "$client should have given an id" |
| subtest {$matches == 0} "$client should not find 'mutually exclusive'" "got $matches matches" |
| |
| set threads_req [get_job_param $job_id "ReqB:S:C:T"] |
| set tasks_req [get_job_param $job_id "NtasksPerN:B:S:C"] |
| set threads_match "0:0:*:$threads_per_core" |
| set tasks_match "0:0:*:$threads_per_core" |
| subtest {$threads_match eq $threads_req} "ReqB:S:C:T should be $threads_match" "$threads_req != $threads_match" |
| subtest {$tasks_match eq $tasks_req} "NtasksPerN:B:S:C should be $tasks_match" "$tasks_req != $tasks_match" |
| cancel_job $job_id |
| } |
| |
| # Test using --cpu-bind=verbose and --hint for salloc/srun sequence |
| set output [run_command_output -subtest "$salloc --hint=nomultithread $srun --cpu-bind=verbose /bin/true"] |
| subtest {[regexp "cpu-bind=" $output]} "The output should contain line starting with cpu-bind=, indicating that --cpu-bind=verbose is in effect" |
| |
| set output [run_command_output -subtest "$salloc --hint=nomultithread /bin/bash -c 'SLURM_CPU_BIND=verbose $srun /bin/true'"] |
| subtest {[regexp "cpu-bind=" $output]} "The output should contain line starting with cpu-bind=, indicating that SLURM_CPU_BIND=verbose srun .. is in effect" |
| |
| set output [run_command_output -subtest "SLURM_CPU_BIND=verbose $salloc --hint=nomultithread $srun /bin/true"] |
| subtest {[regexp "cpu-bind=" $output]} "The output should contain line starting with cpu-bind=, indicating that SLURM_CPU_BIND=verbose srun .. is in effect" |