Buongiorno,
è la prima volta che scrivo su questo forum, nonostante lo segua da diverso tempo.
Ho iniziato da un anno un corso di laurea in informatica e devo sicuramente ringraziare anche matematicamente per aver superato i primi esami di matematica.
La breve introduzione diciamo che c'entra poco con il problema che vado a sottoporvi.
Si tratta di determinare i tempi di esecuzione di una serie di thread in parallelo.
Sto incontrando questa necessità professionalmente, ma purtroppo non riesco a trovare (o probabilmente non cerco nel modo giusto) dei contenuti didattici adeguati per risolverlo.
Il problema è il seguente.
Supponiamo di avere tre funzioni F1, F2, F3.
Ognuna di queste, nell'ordine specificato, accetta in ingresso l'output della funzione precedente.
Per cui sono costretto ad eseguire sequenzialmente, come segue. Dato x, input originale, avremo:
y = F1(x);
z = F2(y);
risultato_finale = F3(z);
Supponiamo ora che le funzioni abbiano durata costante, come seque;
F1 -> 100ms
F2 -> 200ms
F3 -> 300ms
Sappiamo che processare l'elemento x sarà banalmente la somma dei tempi, quindi 600ms.
Quindi, con n = 1 (dove n è il numero di input da processare), avremo un tempo di 600ms.
Ora, con n = 100, se tutti gli elementi fossero processati sequenzialmente attendendo il termine delle tre funzioni prima di procedere all'elemento successivo, otterrò un tempo totale di esecuzione di (600 * 100)ms.
Detto questo, pensiamo invece ora che le tre funzioni possano essere parallelizzate, quindi, F1 processerà i 100 elementi in maniera indipendente. Man mano che preparerà i risultati F2 sarà liberà di iniziare a processare la sua parte e così a sua volta F3 non appena i risultati di F2 saranno pronti.
In questo caso faccio già fatica a stimare un tempo di esecuzione totale, però empiricamente dovrei aver trovato che il tempo totale è uguale a = [T.max(tra F1,F2,F3) * n] + "tempi residui inferiori al massimo". Nel nostro esempio => [300 * 100] + 200 + 100 = 30300ms => ~30sec
Già qui vorrei chiedere se intanto è comprensibile quanto scritto e quanto ho dedotto in merito ai tempi calcolati.
Passiamo oltre.
A questo punto, supponendo di aver calcolato i primi tempi correttamente. Cosa succederebbe se decidessi di parallelizzare N volte la funzione 1, N volte la funzione 2 e così anche per la funzione 3?
Come esprimo questo con una funzione matematica al fine di poter capire quanti processi parallelizzare e poter rimanere in un determinato tempo massimo?
Ringrazio in anticipo per l'attenzione e chiunque vorrà aiutarmi.
Giovanni