Live chat

boboviz Una prece per Higgs (10.04.24, 12:11)
puurome2 Hanno prorogato fino al 4 aprile Il voto per BOINC sul sito WSIS World Summit on the Information Society. (03.04.24, 10:51)
sabayonino Un Augurio a tutti gli "scaccolèr" da parte dello Staff . (31.03.24, 09:09)
kidkidkid3 Sinceri auguri di buone festività pasquali a tutti noi boincitaliani ! Ad maiora ! (30.03.24, 00:34)
valterc Windows 7, Nvidia 980 (25.03.24, 21:11)
valterc https://www.gpugrid.net/results.php?hostid=100638 (25.03.24, 21:11)
puurome2 Purtroppo di Work Unit ATM non ce ne sono più per GPUGRID. Quando c'erano la work unit mi andava sempre in errore. Questo problema delle unità ATM ce l'hanno molti utenti Windows. (24.03.24, 21:09)
samu986 valterc, ah, ok, grazie mille! Speriamo ce ne possano essere allora! (24.03.24, 10:11)
valterc (non sono disponibili sempre però) (22.03.24, 16:18)
valterc uhmmm le workunit ATM: Free energy calculations of protein-ligand binding vanno anche su Windows (22.03.24, 16:17)
samu986 zioriga, oh...ecco spiegato l'arcano...beh, grazie mille per la delucidazione! Spero che andando avanti ce ne potranno essere anche per Windows. Grazie ancora! (21.03.24, 17:58)
zioriga la risposta è semplice, attualmente le Wu per GPU sono solo per LInux (21.03.24, 11:39)
samu986 Buongiorno a tutti, sapete per caso se GPUGRID funziona bene? A me interessano le WU per GPU, infatti ho selezionato solo quelle, ma non mi arriva niente da mesi. Qualcuno potrebbe aiutarmi, per cortesia? (21.03.24, 10:59)
boboviz problemi su Denis@home (11.03.24, 16:02)
Spot T entity macina con l'armata al completo, io a ranghi ridotti e Boinc.Italy è attualmente prima (in L2) (29.02.24, 19:12)
Spot T Ieri è iniziato FB 2024, con le varie novità e subito lo sprint. Per chi volesse partecipare il progetto è Numberfields (29.02.24, 19:10)
boboviz e con i 5gb da scaricare tutte le volte.... (29.02.24, 15:48)
boboviz con il vecchio wrapper (29.02.24, 15:48)
boboviz ancora le wus virtualbox di Rosetta (29.02.24, 15:48)
zioriga al momento io sono quarto assoluto e BOINC.Italy è al terzo posto (14.02.24, 17:57)
Per usare la chat devi effettuare il login.
Benvenuto, Ospite
Nome utente: Password: Ricordami

Supporta BOINC.Italy con una piccola donazione
Leggi tutto...
  • Pagina:
  • 1

ARGOMENTO:

[bash] Forzare GPUGRID a mandare nuovo lavoro 06/11/2018 16:13 #129474

  • Nubman
  • Avatar di Nubman Autore della discussione
  • Offline
  • RAM 512 KB
  • RAM 512 KB
  • Messaggi: 2304
  • Ringraziamenti ricevuti 279
Già che ci siamo, sulla scia del thread sulla richiesta automatizzata di nuovo lavoro vi fornisco questa "perla".

Adattatelo a vostro uso e consumo. Se avete domande, io sono qui.
Levate quella cacata di xml_grep in favore di sed o awk, ad esempio. :asd:

Codice:
#!/bin/bash

# Usage: /home/luis/script/boinc/forceGPUGRIDSendingWork.sh [interval]


boinc_path="/home/luis/Applicazioni/boinc"
boinccmd="./boinccmd"
gpugrid_url="http://www.gpugrid.net/"

cd $boinc_path
if [[ -z `echo $($boinccmd --get_simple_gui_info)` ]]
then
	echo "BOINC is not running. Exit..."
	exit
fi

start_time=$(date +%s)
iter=0
interval=${1:-3600}

while true; do
	# Time vars
	time=$(date +%H':'%M':'%S)
	now_time=$(date +%s)
	script_time=$(echo "$now_time - $start_time" | bc)
	script_time_str=$(printf '%03dd:%02dh:%02dm:%02ds\n' $(($script_time/86400)) $(($script_time%86400/3600)) $(($script_time%3600/60)) $(($script_time%60)))
	iter=$((iter+1))
	reset
	echo -e "Time: ${time} | Execution time: ${script_time_str} | Iteration N.${iter}\n" # "| Interval: ${interval}s\n"
	###

	# BOINC vars
	project_url=(`echo $($boinccmd --get_tasks | grep 'project URL' | awk '{print $3}') | cut -d " " -f 1-`)
	fraction_done=(`echo $($boinccmd --get_tasks | grep 'fraction done' | awk '{print $3}') | cut -d " " -f 1-`)
	#current_cpu_time=(`echo $($boinccmd --get_tasks | grep 'current CPU time' | awk '{print $4}') | cut -d " " -f 1-`)
	state=(`echo $($boinccmd --get_tasks | grep -v 'active_task_state' | grep -v 'scheduler state' | grep 'state' | awk '{print $2}') | cut -d " " -f 1-`)
	###

	# Loop vars
	ntasks=${#project_url[@]}
	task_not_found=1
	###

	# Loop
	for (( i = 0; i < ntasks; i++ )) do
		if [ ${project_url[$i]} == $gpugrid_url ]; then
			
			if [ ${state[$i]} == "uploading" ]; then # Caso: task in upload

				interval=60
				echo -e "GPUGRID: \e[1;33m1 uploading task found\e[0m. Setting interval=${interval}s. Continuing loop."
				continue

			else

				#total_cpu_time=$(echo "${current_cpu_time[$i]} / ${fraction_done[$i]}" | bc)
				#remaining_cpu_time=$(echo "$total_cpu_time - ${current_cpu_time[$i]}" | bc)

				active_task_url=($(xml_grep '//active_task/project_master_url' "$boinc_path/client_state.xml" --text_only))
				active_task_slot=($(xml_grep '//active_task/slot' "$boinc_path/client_state.xml" --text_only))
				for (( j = 0; j < ${#active_task_url[@]}; j++ )) do
					if [ ${active_task_url[$j]} = $gpugrid_url ]; then
						gpugrid_slot=${active_task_slot[$j]}
						break
					fi
				done

				current_gpu_time=$(xml_grep 'checkpoint_elapsed_time' "$boinc_path/slots/$gpugrid_slot/boinc_task_state.xml" --text_only)
				total_gpu_time=$(echo "scale=6; $current_gpu_time / ${fraction_done[$i]}" | bc)
				remaining_gpu_time=$(echo "$total_gpu_time - $current_gpu_time" | bc)

				if [ $(echo "${fraction_done[$i]} >= 0" | bc) -eq 1 -a $(echo "${fraction_done[$i]} < 0.1" | bc) -eq 1 ]; then # Casi: non iniziato o errore di calcolo precoce; miglior stima tempo totale
					interval=1800
				elif [ $(echo "${fraction_done[$i]} >= 0.1" | bc) -eq 1 -a $(echo "$remaining_gpu_time > 600" | bc) -eq 1 ]; then
					interval=$(echo "$remaining_gpu_time / 2" | bc)
				else
					interval=300
				fi

	 			task_not_found=0
				echo -e "GPUGRID: \e[1;32m1 running task found\e[0m. Setting interval=${interval}s. Breaking loop."
				# DEBUG
				#	echo "fd=${fraction_done[$i]}; cct=$current_gpu_time; tct=$total_gpu_time; rct=$remaining_gpu_time"
				###
				break
			fi
		fi
	done
	###

	# Work request
	if [ "$task_not_found" == "1" ]; then
		interval=60
		# /home/luis/script/boinc/refreshBoincProject.sh $gpugrid_url $interval # Looping work request
		$boinccmd --project $gpugrid_url update
		echo -e "GPUGRID: \e[1;31mNo running tasks found\e[0m. Setting interval=${interval}s. Requesting new work."
	fi
	###

	sleep $interval
done

Esempio di output:


Il codice gira ciclicamente, per interromperlo basta il solito Ctrl+C.
COVID-19

Si prega Accedi o Crea un account a partecipare alla conversazione.

[bash] Forzare GPUGRID a mandare nuovo lavoro 06/11/2018 20:26 #129478

  • sabayonino
  • Avatar di sabayonino
  • Offline
  • Administrator
  • Administrator
  • Gentoo||KDE
  • Messaggi: 5718
  • Ringraziamenti ricevuti 338
Io ottengo URL doppi
~ $ project_url=($(echo $(boinccmd --get_tasks | grep 'project URL' | awk '{print $3}' )))
~ $ echo ${project_url[@]}
http://setiathome.berkeley.edu/ http://setiathome.berkeley.edu/ http://setiathome.berkeley.edu/ http://setiathome.berkeley.edu/ http://setiathome.berkeley.edu/ http://setiathome.berkeley.edu/ http://universeathome.pl/universe/ http://universeathome.pl/universe/ http://universeathome.pl/universe/ http://universeathome.pl/universe/ http://universeathome.pl/universe/ http://universeathome.pl/universe/ http://universeathome.pl/universe/ http://universeathome.pl/universe/ http://wuprop.boinc-af.org/ http://setiathome.berkeley.edu/ http://setiathome.berkeley.edu/ http://setiathome.berkeley.edu/ http://setiathome.berkeley.edu/ http://universeathome.pl/universe/ http://setiathome.berkeley.edu/


Aggiungici un "uniq -u" per scrupolo
project_url=($(echo $(boinccmd --get_tasks | grep 'project URL' | uniq -u | awk '{print $3}')))

il "cut" puoi ometterlo dato che la variabile è all'interno di una matrice e viene salvata solo la stringa (in pratica non tiene conto dello spazio o del "carridge" se c'è)
~ $ echo ${project_url[@]}
http://wuprop.boinc-af.org/ http://universeathome.pl/universe/ http://setiathome.berkeley.edu/
$ echo "#### ${project_url[1]} ####"
#### http://universeathome.pl/universe/ ####
~ $ echo ${project_url[0]}
http://wuprop.boinc-af.org/
~ $ echo ${project_url[1]}
http://universeathome.pl/universe/
~ $ echo ${project_url[2]}
http://setiathome.berkeley.edu/

I cicli "for" in bash possono essere scritti anche con la sintassi del C , ma puoi utilizzare quella sua... utilizzando l'intera ampiezza della matrice
for i in "${URL[@]}"  ; do 
<codice>
done

E i doppi apici nelle variabili sono sempre ben accetti in caso nella variabile ci siano parole divise dallo spazio
A="Oh My Boinc ! "
echo "${A}"

anche nel paragone delle stringhe...

echo $($boinccmd --get_simple_gui_info)`
potrebbe restituire un "Can't connect to localhost" se cerca un servizio ... anche se poi riporta un eventuale status "1"

Devia lo standard error ...
echo $($boinccmd --get_simple_gui_info 2>/dev/null)


Nell' elenco progetti , se devi utilizzare uno o "N" progetti specifici puoi utilizzare "case" "in un ciclo degli URL trovati
Quindi puoi adattarlo per uno o più progetti
for URL in ${project_url[@]}" ; do
case "${URL}" in 
"${gpugrid_url}" ) <codice per questo url>
;;
"${opzionale_altro_URL}") <codice>
;;
[...]
;;
*) < altro codice per tutti gli altri URL non interessati>
;;
esac
done

se i codici sono uguali per tutti si può creare una funzione generale da richiamare ,
funzione1 () {
<codice funzione1 >
}

se "case" richiede prj1+proj2 con funzione1 e prj3 con funzione2
[...]
case "${URL}" in
"${URL1}"|"${URL2}") funzione1
;;
"${URL3}")funzione2
;;
*) <tutto il resto altro codice o funzione >
;;
esac
[...]
Ringraziano per il messaggio: Nubman

Si prega Accedi o Crea un account a partecipare alla conversazione.

Ultima Modifica: da sabayonino.

[bash] Forzare GPUGRID a mandare nuovo lavoro 08/11/2018 10:18 #129486

  • Nubman
  • Avatar di Nubman Autore della discussione
  • Offline
  • RAM 512 KB
  • RAM 512 KB
  • Messaggi: 2304
  • Ringraziamenti ricevuti 279
Grazie saba, quando posso ci do un occhio.

Segnalo un baco, indicatomi da StefanR5R/xii5ku di AnandTech, che non ho ancora corretto nello script, ma che per fortuna non crea problemi nell'esecuzione vista la rarità della sua occorrenza.
Praticamente all'inizio dello script richiamo "boinccmd --get_tasks" 3 volte. C'è la remota possibilità che la lista dei task cambi in quegli instanti. In tal caso gli elementi degli array project_url, fraction_done e state non corrisponderebbero. La soluzione ovviamente è di eseguirlo una sola volta e poi creare gli array.
COVID-19

Si prega Accedi o Crea un account a partecipare alla conversazione.

Ultima Modifica: da Nubman.

[bash] Forzare GPUGRID a mandare nuovo lavoro 08/11/2018 12:15 #129487

  • sabayonino
  • Avatar di sabayonino
  • Offline
  • Administrator
  • Administrator
  • Gentoo||KDE
  • Messaggi: 5718
  • Ringraziamenti ricevuti 338
Senza che mi metta ad interpretare lo script , puoi farmi un riassunto di cosa fa , magari provo a mettere del mio :asd: vediam che ne esce...

Si prega Accedi o Crea un account a partecipare alla conversazione.

[bash] Forzare GPUGRID a mandare nuovo lavoro 08/11/2018 12:41 #129488

  • Nubman
  • Avatar di Nubman Autore della discussione
  • Offline
  • RAM 512 KB
  • RAM 512 KB
  • Messaggi: 2304
  • Ringraziamenti ricevuti 279
Certamente.

Problema: per GPU come la 750Ti o più lente è fondamentale mantenere la riserva minima/massima di lavoro a valori pressoché nulli. Questo comporta che quando consegni una wu, non è detto che ne ricevi subito un'altra. BOINC in automatico ritenta la richiesta di nuovo lavoro con intervalli di tempo, a mio avviso, troppo larghi. Si finisce per ritrovarsi con la GPU in idle per mezza giornata o più. Come dicevo, è meglio non avere una riserva elevata perché poi perdi facilmente i bonus delle 24h/48h. L'obiettivo che si pone lo script è di prendere anche quelli delle 24h.

Soluzione: uno script che martella il server di richieste in maniera intelligente, cioè quando non ha più task. La ragionevolezza di questa insistenza è soggettiva. :asd:

Il codice fa questo:
-se trova un task di GPUGRID in stato "uploading", setta l'intervallo a 60s
-altrimenti:
*se trova task di GPUGRID già cominciato con percentuale di completamento tra 0 e 10%, setta l'intervallo a 1800s (per beccare task che sono andati in errore di calcolo nel giro di qualche ora sostanzialmente)
*se la percentuale di completamento è maggiore o uguale a 10% oppure il tempo di elaborazione rimanente stimato è maggiore di 10 minuti, setta l'intervallo a un valore pari alla metà del tempo rimanente (per i task in corso da 2-3 ore sino a poche decine di minuti dal completamento);
*altrimenti setta l'intervallo a 300s (per i task prossimi al completamento).

Poi c'è anche una variabile che indica se occorre chiedere al server nuovo lavoro oppure no. Se il client è senza lavoro, chiede nuovo lavoro ogni minuto.

P.S.1 codice è fatto per un client dedicato a GPUGRID, per quanto riguarda la GPU e ci si aspetta che ci sia un solo task di GPUGRID alla volta (riserva di lavoro nulla o quasi).
P.S.2 i tempi degli intervalli sono tarati per la mia 750Ti.
COVID-19

Si prega Accedi o Crea un account a partecipare alla conversazione.

[bash] Forzare GPUGRID a mandare nuovo lavoro 08/11/2018 19:31 #129496

  • sabayonino
  • Avatar di sabayonino
  • Offline
  • Administrator
  • Administrator
  • Gentoo||KDE
  • Messaggi: 5718
  • Ringraziamenti ricevuti 338
facevo prima a leggere il codice :asd:

ok. provo a buttare giù qualcosa appena posso

Ho pure io delle 750ti (2 x 3 mobo)

Si prega Accedi o Crea un account a partecipare alla conversazione.

Ultima Modifica: da sabayonino.

[bash] Forzare GPUGRID a mandare nuovo lavoro 08/11/2018 19:37 #129497

  • sabayonino
  • Avatar di sabayonino
  • Offline
  • Administrator
  • Administrator
  • Gentoo||KDE
  • Messaggi: 5718
  • Ringraziamenti ricevuti 338

Grazie saba, quando posso ci do un occhio.

Segnalo un baco, indicatomi da StefanR5R/xii5ku di AnandTech, che non ho ancora corretto nello script, ma che per fortuna non crea problemi nell'esecuzione vista la rarità della sua occorrenza.
Praticamente all'inizio dello script richiamo "boinccmd --get_tasks" 3 volte. C'è la remota possibilità che la lista dei task cambi in quegli instanti. In tal caso gli elementi degli array project_url, fraction_done e state non corrisponderebbero. La soluzione ovviamente è di eseguirlo una sola volta e poi creare gli array.



Riguardo a questo :

semplicemente puoi provare a salvare tutto l'output in una variabile (richiamando --get_tasks una sola volta) nuda e cruda (non in una matrice) e poi filtrare la variabile come indicato provando a fare dei controlli per vedere se c'è qualche carattere/spazio o altro che possa creare intralcio)

I comandi sono molto vicini , ma nella remota possibilità che uno (o tutti) di questi comandi ci impieghi molo tempo allora si , l'analisi può essere sfalsata.

Si prega Accedi o Crea un account a partecipare alla conversazione.

Ultima Modifica: da sabayonino.
  • Pagina:
  • 1
Tempo creazione pagina: 0.140 secondi
Powered by Forum Kunena