115 lines
4.2 KiB
Bash
Executable file
115 lines
4.2 KiB
Bash
Executable file
#!/bin/bash
|
|
#
|
|
#
|
|
#
|
|
# FastFlow is free software; you can redistribute it and/or modify it
|
|
# under the terms of the GNU Lesser General Public License version 3 as
|
|
# published by the Free Software Foundation.
|
|
# Starting from version 3.0.1 FastFlow is dual licensed under the GNU LGPLv3
|
|
# or MIT License (https://github.com/ParaGroup/WindFlow/blob/vers3.x/LICENSE.MIT)
|
|
#
|
|
# This program 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 Lesser General Public
|
|
# License for more details.
|
|
#
|
|
# You should have received a copy of the GNU Lesser General Public License
|
|
# along with this program; if not, write to the Free Software Foundation,
|
|
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
#
|
|
#
|
|
# Author: Massimo Torquati
|
|
#
|
|
# Requires: bash >=3.2, hwloc
|
|
#
|
|
# The script builds a string containing the list of logical core of the
|
|
# machine that are topologically contiguous, i.e the first context of the
|
|
# first core, the first context of the second core, and so on up to the
|
|
# last context of the last core.
|
|
# It also can set two variables:
|
|
# FF_NUM_CORES
|
|
# FF_NUM_REAL_CORES
|
|
#
|
|
# Example: Given the following OS numbering for the logical cores
|
|
#
|
|
# CPU0: CPU1:
|
|
# node0 || node1 node2 || node3
|
|
# ------------------ ------------------
|
|
# | 0 | 4 || 2 | 6 | | 1 | 5 || 3 | 7 |
|
|
# | 8 |12 ||10 |14 | | 9 |13 ||11 |15 |
|
|
# ------------------ ------------------
|
|
#
|
|
# the string produced is:
|
|
# "0,4,2,6,1,5,3,7,8,12,10,14,9,13,11,15".
|
|
# FF_NUM_CORES=16
|
|
# FF_NUM_REAL_CORES=8
|
|
#
|
|
|
|
topocmd=lstopo # or lstopo-no-graphics or hwloc-ls
|
|
|
|
# It checks if the topocmd is available
|
|
command -v $topocmd >/dev/null ||
|
|
{ echo >&2 "This script requires hwloc to be installed."; exit 1; }
|
|
|
|
physical=$($topocmd --only core | wc -l) # gets the number of physical cores
|
|
logical=$($topocmd --only pu | wc -l) # gets the number of logical cores
|
|
# this is the number of contexts per physical core
|
|
nway=$(($logical/$physical))
|
|
|
|
# It reads lines from standard input into an indexed array variable.
|
|
# The right-hand side script returns the ids of the Processing Unit of
|
|
# the machine in the linear order.
|
|
# Considering the example above the topocmd command returns something like:
|
|
# 0 8 4 12 2 10 6 14 1 9 5 13 3 11 7 15.
|
|
# (We do not use mapfile command for portability on MacOS and bash<4)
|
|
while IFS= read -r line; do
|
|
array+=("$line")
|
|
done < <( $topocmd --only pu | awk -F'[#)]' '{print $3}' )
|
|
|
|
for((i=0;i<${#array[@]};i+=nway)); do
|
|
for((j=0;j<$nway;++j)); do
|
|
V[j]+="${array[i+j]},"
|
|
done
|
|
done
|
|
for((j=0;j<$nway;++j)); do
|
|
str+=${V[j]}
|
|
done
|
|
# remove the last comma
|
|
string=${str::${#str}-1} # on bash>4 just ${str::-1}
|
|
echo "FF_MAPPING_STRING=\"$string\""
|
|
echo "FF_NUM_CORES=$logical"
|
|
echo "FF_NUM_REAL_CORES=$physical"
|
|
|
|
read -p "Do you want that I change the ./config.hpp file for you? (y/N) " -n 1 -r
|
|
echo
|
|
if [[ $REPLY =~ ^[Yy]$ ]]
|
|
then
|
|
sed -i -e "s/^#define FF_MAPPING_STRING \".*\"/#define FF_MAPPING_STRING \"$string\"/1" config.hpp
|
|
if [ $? -eq 0 ]; then
|
|
echo "This is the new FF_MAPPING_STRING variable in the ./config.hpp file:"
|
|
echo -e "\033[1m $(grep -m1 "^#define FF_MAPPING_STRING \"" config.hpp) \033[0m"
|
|
else
|
|
echo "something went wrong when replacing the variable FF_MAPPING_STRING...."
|
|
exit 1
|
|
fi
|
|
sed -i -e "s/^#define FF_NUM_CORES [-]\{0,1\}[[:digit:]].*/#define FF_NUM_CORES $logical/1" ./config.hpp
|
|
if [ $? -eq 0 ]; then
|
|
echo "This is the new FF_NUM_CORES variable in the ./config.hpp file:"
|
|
echo -e "\033[1m $(grep -m1 "^#define FF_NUM_CORES " config.hpp) \033[0m"
|
|
else
|
|
echo "something went wrong when replacing the variable FF_NUM_CORES...."
|
|
exit 1
|
|
fi
|
|
sed -i -e "s/^#define FF_NUM_REAL_CORES [-]\{0,1\}[[:digit:]].*/#define FF_NUM_REAL_CORES $physical/1" ./config.hpp
|
|
if [ $? -eq 0 ]; then
|
|
echo "This is the new FF_NUM_REAL_CORES variable in the ./config.hpp file:"
|
|
echo -e "\033[1m $(grep -m1 "^#define FF_NUM_REAL_CORES " config.hpp) \033[0m"
|
|
else
|
|
echo "something went wrong when replacing the variable FF_NUM_REAL_CORES...."
|
|
exit 1
|
|
fi
|
|
else
|
|
echo "Ok, nothing has been changed"
|
|
fi
|
|
|
|
exit 0
|