Script para executar programa quando tiver núcleo livre? [RESOLVIDO]

1. Script para executar programa quando tiver núcleo livre? [RESOLVIDO]

Ismael Felipe Ferreira dos santos
IsmaelSantos

(usa Ubuntu)

Enviado em 29/12/2020 - 03:25h

Olá,

Sei o básico se scripts mas isso já está fora dos meus conhecimentos, também sei que pode não ser muito útil tentar aprender aos poucos pesquisando na net sem antes perguntar a quem entende do assunto (farei isso se ninguém me ajudar)... Então lá vai meu desejo.

Quero fazer em shell Script o que propões o seguinte pseudocódigo:


# Compilar
Compile o programa C e salve o executável como a.o # Sei fazer

# Executar quando houver núcleo livre
Verifique quantos núcleos tem o processador da máquina # Daqui em diante já não sei

loop em argumento # Sei fazer loops e condicionais
Verifique quantos processos estão sendo executados (ps arxu?)
Loop infinito
Se há menos processos quanto núcleos-1 # Um dos núcleos deve ficar livre para este script
Execute "a.o argumento"
Pule para o próximo argumento
Fim se
Espere 1 min
Fim loop infinito
fim loop em argumento

Loop infinito
Se todos todos "a.o" terminaram
Sair do loop
Fim se
espere 1 min
Fim loop infinito

[... Resto do código - plotar gráficos - ai já é tranquilo...]



Motivo? Me disseram que se uma máquina tem processador de N núcleos então não posso executar meu programa mais que N vezes, sob pena de prejudicar os cálculos. Claro que no cluster há muitas máquinas mas não quero ter que executar manualmente meu programa umas mil vezes...

Se quiserem podem mandar o script e explicar cada comando (claro que também quero aprender) ou apenas mandar fontes que falem sobre cada uma das dificuldades.

Não sei se é importante mas... Minha máquina roda Ubuntu Minimal (quero testar nela) e as do cluster rodam openSUSE.


  


2. MELHOR RESPOSTA

suassana
sussa10

(usa Outra)

Enviado em 29/12/2020 - 20:20h

AHHHH mas eu ri demais, adoro esse povo bravo.

Então, acho que vc devia usar o GNU Parallel mesmo, que é muito mais fácil.

Mas de qualquer forma, eu tenho umas soluções para trabalhos assincronos
usando os recursos da SHELL ao invés do GNU Parallel (o GNU Parallel é *mais fácil de usar*).

Aqui vai um exemplo para bash:

#!/bin/bash

#array $cpus, o valor do número de cpus vai estar no índice 1 do array.
cpus=( $( lscpu | grep '^CPU(s):' ) )

JOBMAX=${cpus[1]}

for ARG in argumento1 argumento2 argumento3 argumento4 argumento5 argumento6 argumento7 argumento8 argumento9
do
while
JOBS=( $( jobs -p ) )
(( ${#JOBS[@]} > JOBMAX ))
do
sleep 0.04
done

{
echo "$ARG"
sleep 1
} &
done


Se tu conseguir usar o KSH, ele já tem uma variável $JOBMAX
interna que a própria shell usa para lançar processos em BATCHES,
mas funciona um pouco diferente da solução que escrevi acima,
por que o KSH espera um batch inteiro terminar para lançar o próximo..

Nesse exemplo acima não vai dar para ver muito a diferença por que
cada processo lançado para o background com { .. } &
tem duração fixa de 1 segundo, mas de qq forma,
esse while loop vai evitar que uma nova tarefa seja lançada
se houver mais processos de background do que o que vc quer,
no caso coincidirá com o número de núcleos, mas é claro que os núcleos
trabalham em ressonância..

Pro ZSH tem que usar uma outra estratégia..

while
(( ${#jobstates[@]} > JOBMAX ))
do
sleep 0.04
done



3. Re: Script para executar programa quando tiver núcleo livre? [RESOLVIDO]

João Cláudio de Alcântara
aguamole

(usa Lubuntu)

Enviado em 29/12/2020 - 09:04h

Script sem sentido e sem utilidade.

CPU i5-8400 GTX 750 SofRaid 4xSSD 16GB DDR4 mesmo assim uso Lubuntu.


4. Re: Script para executar programa quando tiver núcleo livre? [RESOLVIDO]

Ismael Felipe Ferreira dos santos
IsmaelSantos

(usa Ubuntu)

Enviado em 29/12/2020 - 13:02h

aguamole escreveu:

Script sem sentido e sem utilidade.

CPU i5-8400 GTX 750 SofRaid 4xSSD 16GB DDR4 mesmo assim uso Lubuntu.


Aparentemente sua arrogância não te permite ver que es um inculto, pouco sabe sobre programação de verdade, nem nunca tentou executar programas de cálculo numérico em um computador para resolver equações diferenciais (só acho), do contrário saberia que há muita utilidade em não executar o programa simultaneamente muitas vezes e que, se você quiser curvas bem suaves no final, então deverá executar seu programa centenas de vezes. Se pedi é por ver sim utilidade e se você não sabe ou não quer ajudar então melhor é que fique quieto, afinal bem vi que calado eras poeta.


5. Re: Script para executar programa quando tiver núcleo livre? [RESOLVIDO]

leandro peçanha scardua
leandropscardua

(usa Ubuntu)

Enviado em 29/12/2020 - 13:54h

Com todo respeito acho q vc vai gastar mais tempo fazendo o script do q efetivamente fazendo o cálculo pq vc quer fazer algo difícil de ser controlado, ainda mais dentro de um loop.
O linux tem um comando chamado parallel p rodar comandos em paralelo. Ele tem a opção de rodar remotamente, então se vc configurar os acessos às máquinas do cluster, o resto ele faz sozinho.
https://www.gnu.org/software/parallel/parallel_tutorial.html


6. Re: Script para executar programa quando tiver núcleo livre?

João Cláudio de Alcântara
aguamole

(usa Lubuntu)

Enviado em 29/12/2020 - 14:11h

Processadores são desenvolvido para ser multitarefa você simplesmente quer retirar dele o que ele foi criado a fazer.
Esse tipo de script é sem sentido uma vez que CPU são multitarefa.
E inútil porque ninguém tem motivo para usar uma CPU que é limitado a tarefa.
É por isso que CPU mono tarefa nem é mais fabricado.
Ninguém tem interesse em CPU que tem limitação de processos as pessoas querem CPU mais potente e não um controle em seu potencial.
Não é arrogância é a realidade é sem utilidade e sem sentido.
Eu estou te explicando o que você não sabe.
Você pensa em fazer esse script ai porque você não sabe o proposito de desenvolvimento de CPU.
Você nem mesmo sabe o quanto de processo que tem em um SO.
Não existe nenhum SO que deixa o core da CPU desocupada.

CPU i5-8400 GTX 750 SofRaid 4xSSD 16GB DDR4 mesmo assim uso Lubuntu.


7. Re: Script para executar programa quando tiver núcleo livre?

João Cláudio de Alcântara
aguamole

(usa Lubuntu)

Enviado em 29/12/2020 - 20:47h

sussa10 escreveu:

AHHHH mas eu ri demais, adoro esse povo bravo.

Você é brabo mesmo.
Ate fez o script que o menino pediu.


CPU i5-8400 GTX 750 SofRaid 4xSSD 16GB DDR4 mesmo assim uso Lubuntu.


8. Re: Script para executar programa quando tiver núcleo livre? [RESOLVIDO]

suassana
sussa10

(usa Outra)

Enviado em 29/12/2020 - 20:57h

Acho que ele nunca mais vai voltar...


9. Re: Script para executar programa quando tiver núcleo livre? [RESOLVIDO]

João Cláudio de Alcântara
aguamole

(usa Lubuntu)

Enviado em 29/12/2020 - 21:05h

Uai eu expliquei para ele que CPU é multitarefa e ele fico chatiado.

CPU i5-8400 GTX 750 SofRaid 4xSSD 16GB DDR4 mesmo assim uso Lubuntu.


10. Re: Script para executar programa quando tiver núcleo livre? [RESOLVIDO]

Ismael Felipe Ferreira dos santos
IsmaelSantos

(usa Ubuntu)

Enviado em 29/12/2020 - 21:12h

aguamole escreveu:

Uai eu expliquei para ele que CPU é multitarefa e ele fico chatiado.

CPU i5-8400 GTX 750 SofRaid 4xSSD 16GB DDR4 mesmo assim uso Lubuntu.


No sua primeira resposta você criticou a ideia sem explicar nada. E mesmo que os núcleos sejam multitarefa ainda há utilidade em limitar o número de processos, o fato de serem multitarefa apenas diz que a o número de tarefas pode ser escolhido ao bel prazer (ou conforme aguentar a máquina).






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts