Con i core del processore K, come dividere in modo ottimale N lavori in gruppi, con ogni gruppo da elaborare sequenzialmente da un core del processore, quando il tempo di elaborare ogni lavoro è sconosciuto in anticipo e c'è un sovraccarico associato all'elaborazione di ciascun gruppo di posti di lavoro?
È possibile uccidere un gruppo di lavori prima che venga completato, ma in seguito non verrà estratto alcun utile progresso di elaborazione da quel gruppo di lavori.
Se faccio solo la dimensione di ciascun gruppo 1, li aggiungo a una coda e li elaboro in una sola volta, quindi il sovraccarico può dominare il tempo totale. Se li divido in gruppi di dimensioni uguali a K, il sovraccarico può ancora dominare il tempo totale e potrei essere sfortunato e avere tutti i lavori più lenti in un gruppo che rallenta ulteriormente le cose.
Questo è un esempio di un problema generale ben studiato con un algoritmo capito da elaborare in modo ottimale?
Ad esempio, supponiamo di avere 326400 lavori, 32 core e circa 5 secondi di overhead associati all'elaborazione di un gruppo.
- 3.200 lavori grandi richiedono 2 minuti ciascuno per l'elaborazione se eseguiti in quattro gruppi separati
- 3.200 lavori medi richiedono 1 minuto ciascuno da elaborare se eseguiti in quattro gruppi separati
- i restanti 320.000 piccoli lavori occupano circa 5.001 secondi ciascuno per l'elaborazione se eseguiti in 320.000 gruppi separati.
- per i 5.001 secondi per i piccoli lavori, 1 millisecondo è dovuto all'elaborazione e 5 secondi sono dovuti al sovraccarico di elaborazione di qualsiasi gruppo. se tutti i piccoli lavori sono eseguiti in un gruppo, ci vogliono 325 secondi per elaborare il totale a causa della condivisione del sovraccarico (320.000 * 1 millisecondo + 5 secondi = 325 secondi)
Se ho appena creato ciascuna dimensione di gruppo 1, ho messo i gruppi in una coda e ho eseguito 32 alla volta contemporaneamente su 32 core, e mi è capitato di scegliere prima i 3.200 lavori più importanti dalla coda, poi i 3.200 lavori medi dalla in coda, ci vorrebbero 200 minuti per finire i grandi lavori, 100 minuti per i lavori medi da finire e 833,5 minuti per i piccoli lavori da completare: 18 ore in totale.
In modo ottimale elaborerei prima i lavori più grandi (1 lavoro per gruppo), poi i lavori medi (1 lavoro per gruppo), quindi suddividerei i rimanenti piccoli lavori in 32 gruppi per un totale di circa 5 ore totali da finire.
Spero che ci sia un algoritmo ben studiato che non conosco che gestisca bene questa situazione.