Ho il programma D2 che, nella sua forma attuale, è a thread singolo e chiama la stessa funzione pura da 10 a 100 volte in un loop interno per ogni iterazione del ciclo esterno di questo programma. Non esiste alcuna dipendenza dai dati tra le chiamate, ovvero nessuna chiamata utilizza il risultato di un'altra chiamata. Nel complesso, questa funzione è chiamata milioni di volte ed è il principale collo di bottiglia nel mio programma. I parametri sono unici quasi ogni volta, quindi il caching non aiuta.Come parallelizzare la piccola funzione pura?
A prima vista, questo sembra il candidato perfetto per la parallelizzazione. L'unico problema è che la funzione impiega solo circa 3 microsecondi per chiamata, ben al di sotto della latenza di creazione di un nuovo thread, e non molto oltre il sovraccarico di aggiunta di un lavoro a un pool di attività (ovvero, acquisizione di un mutex, allocazione della memoria a conservare le informazioni sull'attività, trattando possibili conflitti per la coda del gruppo di attività, ecc.). C'è un buon modo per sfruttare il parallelismo che è questo a grana fine?
3 microsecondi e 100 chiamate? Quindi questo richiede 0,0003 secondi per essere eseguito in totale? Dov'è il collo di bottiglia? –
Questo vale per un'iterazione del ciclo esterno. Il ciclo esterno esegue milioni e in futuro forse miliardi di volte. – dsimcha
Ecco una domanda simile che ho chiesto di recente: http://stackoverflow.com/questions/564577/dividing-loop-iterations-among-threads –