Execute os tutoriais precedentes nesta série:
Caso este tutorial esteja sendo executado com auxílio do container
Docker fornecido, execute o comando abaixo logo após iniciar a sessão
R e antes de executar os demais passos.
.libPaths(c("~/R", .libPaths()))Vamos utilizar o pacote DoE.base (descrição mais detalhada) da
linguagem R para gerar um projeto experimental fatorial completo
combinando os fatores a serem analisados. Como o objetivo nesta série
de tutorial é analisar o tempo de execução e speedup em função de dois
escalonadores e dois tamanhos de problema, definimos dois fatores:
scheduler e size. Testaremos dois escalonadores: random e dmdas e dois
tamanhos 4800 e 9600, para um total de 4 combinações possíveis, com
três replicações cada.
O comando set.seed(0) (veja abaixo) é utilizado para fixar uma ordem
aleatória, permitindo a geração do mesmo ordenamento da bateria
experimental. O código abaixo pode ser executado no interpretador R
com o pacote DoE.base instalado.
suppressMessages(library(DoE.base))
set.seed(0)
exp_erad <-
fac.design(factor.names =
list(
size = c(4800, 9600),
scheduler = c("random", "dmdas")),
replications = 3,
randomize = TRUE)
print(exp_erad)creating full factorial with 4 runs ... run.no run.no.std.rp size scheduler Blocks 1 1 2.1 9600 random .1 2 2 1.1 4800 random .1 3 3 4.1 9600 dmdas .1 4 4 3.1 4800 dmdas .1 5 5 1.2 4800 random .2 6 6 2.2 9600 random .2 7 7 4.2 9600 dmdas .2 8 8 3.2 4800 dmdas .2 9 9 3.3 4800 dmdas .3 10 10 2.3 9600 random .3 11 11 4.3 9600 dmdas .3 12 12 1.3 4800 random .3 class=design, type= full factorial NOTE: columns run.no and run.no.std.rp are annotation, not part of the data frame
A função fac.design gerou uma sequência aleatória de combinações
que serão executadas para que possamos avaliar a influência de cada
fator no desempenho da aplicação. Exportaremos o projeto gerado para
um arquivo CSV que deverá ser registrado juntamente com os logs
contendo os resultados brutos do experimento.
export.design(exp_erad,
filename = "projeto-experimental",
type = "csv",
replace = TRUE)Vejamos o conteúdo do arquivo CSV criado:
cat projeto-experimental.csv"name","run.no.in.std.order","run.no","run.no.std.rp","size","scheduler","Blocks" "1","2",1,"2.1","9600","random",".1" "2","1",2,"1.1","4800","random",".1" "3","4",3,"4.1","9600","dmdas",".1" "4","3",4,"3.1","4800","dmdas",".1" "5","1",5,"1.2","4800","random",".2" "6","2",6,"2.2","9600","random",".2" "7","4",7,"4.2","9600","dmdas",".2" "8","3",8,"3.2","4800","dmdas",".2" "9","3",9,"3.3","4800","dmdas",".3" "10","2",10,"2.3","9600","random",".3" "11","4",11,"4.3","9600","dmdas",".3" "12","1",12,"1.3","4800","random",".3"
Para facilitar o processo, este arquivo está registrado aqui, e pode ser baixado no parque computacional da seguinte forma:
wget https://github.com/viniciusvgp/boas-praticas/raw/master/projeto-experimental.csvIlustraremos, no exemplo abaixo, um script para execução
não-interativa da aplicação. Para efeitos de simplificação, foi gerado
previamente um projeto experimental (arquivo
projeto-experimental.csv). Veja passo #2.1 para gerá-lo.
Vamos revisar o script que automatiza a execução do experimento.
# ... continuação
# Diretório geral para contar todos os resultados
export EXPEDIR=CHA
# Verificar se projeto experimental é fornecido
PROJETO=projeto-experimental.csv
if [[ -f $PROJETO ]]; then
echo "O projeto experimental é o seguinte"
cat $PROJETO | sed -e "s/^/PROJETO|/"
# Salva o projeto no diretório corrente (da saída)
cp $PROJETO .
else
echo "Arquivo $PROJETO está faltando."
exit
fi
mkdir -p $EXPEDIR
#Criar arquivo de tempos
touch $EXPEDIR/"times"
# Ler o projeto experimental, e para cada experimento
tail -n +2 $PROJETO |
while IFS=, read -r name runnoinstdorder runno runnostdrp size scheduler Blocks
do
# Limpar valores
export name=$(echo $name | sed 's/\"//g')
export scheduler=$(echo $scheduler | sed 's/\"//g')
export size=$(echo $size | sed 's/\"//g')
export KEY="$name-$scheduler-$size"
export STARPU_SCHED=$scheduler
./chameleon/bin/timing/time_dpotrf_tile --nb=960 --n_range=$size:$size:$size --nowarmup -c > $EXPEDIR/${KEY}."stdout"
out=($(cat $EXPEDIR/${KEY}."stdout" | tail -n 1))
echo $name","$scheduler","$size","${out[3]} >> $EXPEDIR/"times"
donePara facilitar o processo, este arquivo está registrado aqui, e pode ser baixado no ambiente computacional da seguinte forma:
wget https://github.com/viniciusvgp/boas-praticas/raw/master/executa-projeto.shCaso este tutorial esteja sendo seguido com auxílio do container Docker fornecido, sugerimos a utilização dos comandos abaixo para a execução do projeto experimental na instalação do Chameleon já disponibilizada no container.
git clone https://github.com/viniciusvgp/boas-praticas.git
cd boas-praticas
spack view soft ./chameleon chameleon@0.9.2
./executa-projeto.shCompacte o diretório experimental:
tar cfz exp0.tgz CHA/Siga para o passo #3 Análise.
Veja mais informações aqui (opcional).