Esecuzione di un processo più volte allo stesso tempo

1

Ho un programma c ++ con libreria opencv che prende un'immagine come input ed esegue la stima della posa, il rilevamento del colore, il phog. Quando eseguo questo programma dalla riga di comando ci vogliono circa 4-5 sec per essere completato. Ci vuole circa il 60% di CPU. Quando provo a eseguire lo stesso programma da due finestre della riga di comando diverse contemporaneamente, il processo richiede circa 10-15 secondi per terminare e il processo termina quasi nello stesso tempo. L'utilizzo della CPU raggiunge fino al 100%.

Ho un sito web che chiama questo exe c ++ usando il comando exec (). Quindi, quando due utenti tentano di caricare un'immagine e l'esecuzione richiede più tempo, come ho spiegato sopra nella riga di comando. Questo perché il programma c ++ comporta un alto calcolo e la CPU raggiunge il 100% rallenta? Ma ho letto che la CPU che raggiunge il 100% non è una brutta cosa dato che il computer sta usando la sua piena capacità per eseguire il programma. Quindi è a causa del mio programma c ++ o è qualcosa a che fare con le mie impostazioni del server (computer)? Questo probabilmente non è il problema del server Apache perché quando provo ad eseguirlo dalla riga di comando rallenta anche. Sto usando un processore quad core e tutte le 4 CPU raggiungono il 100% quando cerco di eseguire lo stesso processo allo stesso tempo, quindi penso che sia distribuito tra tutti i processori. Quindi ho qualche altra domanda:

1) Può essere risolto utilizzando il multithreading nel mio codice c ++? Per ora non lo sto usando, ma il multithreading renderà il codice c ++ più costoso dal punto di vista computazionale e aumenterà l'utilizzo della CPU (se questo è il problema).

2) Quale può essere la ragione del rallentamento? Il processo è in una coda e ogni processo viene eseguito solo una certa quantità di tempo e passa da un processo all'altro?

3) Se questo è dovuto al fatto che comporta un calcolo elevato, sarà di aiuto se modifico alcune funzioni sulle funzioni opencv gpu?

4) C'è un modo per risolvere questo problema con qualche idea o suggerimento?

Ho inserito il risultato di top quando eseguo un processo ed eseguo lo stesso processo due volte allo stesso tempo:

Version5 è il processo, che lo esegue una volta Dueversioni5inesecuzionecontemporaneamente

Grazie in anticipo.

    
posta user1583647 20.02.2014 - 08:42
fonte

1 risposta

3

Non sono rimasto sorpreso dai numeri che stai segnalando dopo aver preso in considerazione ciò che il programma sembra fare. È intensivo dal punto di vista computazionale con molti recuperi di dati della memoria. Il file I / O sarebbe lento rispetto e non ho la sensazione che questo sia un problema (ancora).

Guardando i tuoi numeri, sto pensando che pensi che 4-5 sec x due dovrebbero essere 8-10 sec.? Dico realisticamente che il meglio che potreste aspettarvi sarebbe di 9-12 secondi. Nulla è l'ideale. Usando il mio 'mud math' abbiamo 3 sec di CPU in più di ~ anticipati ~. È un sacco di CPU.

Prenderò di mira il contenimento dell'accesso alla memoria come primo punto di indagine. CPU core condivise utilizzeranno lo stesso bus di memoria e l'accesso alla memoria. Probabilmente usano anche le stesse cache on-chip. Ma due processi come questo vorranno sia "riempire" la cache dei dati. Ad esempio, P01 potrebbe quindi alcuni calcoli e utilizzare il 50% della cache dei dati; poi arriva P02 che vuole anche il 50% delle risorse. Ma non sarà disponibile al 50% perché il sistema operativo ne ha bisogno e ci sono altri (importanti) processi come il tuo server, ecc.

In ogni caso il risultato atteso è che P02 eliminerà una parte significativa delle risorse di P01. Ciò significa che P01 troverà che deve andare alla DRAM per alcuni dei dati che desidera per i calcoli successivi. Se sono vicino, otterrai prestazioni lineari migliori accodando le tue trasformazioni e eseguendole in sequenza. Puoi testarlo nella shell dei comandi inserendo P01 e P02 in uno script:

P01
P02

Se il tempo trascorso è inferiore a 12 sec. quindi c'è una contesa di risorse coinvolte (non necessariamente cache di memoria). In tal caso, ti consiglio di utilizzare un qualche tipo di coda.

Attualmente il tempo trascorso (il caso migliore) per entrambi i client è: 10 sec. (ciascuno) perché entrambi sono rallentati. Se si mette in coda, il client uno attende 5 secondi e il client due attende 10 secondi. Il client 2 non è peggio. Ovviamente non è davvero scalabile. Tuttavia, una coda di trasformazione è scalabile se è possibile includere una o più macchine di back-end per elaborare i processi dalla coda.

Poiché la trasformazione è accodata, l'utente può fare qualcosa di interessante mentre avviene la trasformazione. Ciò può bloccare temporaneamente un problema di conflitto di risorse.

Il tuo altro lavoro è scoprire quali risorse stanno per essere distrutte. Potrebbe non essere facile a seconda della macchina e degli strumenti di basso livello disponibili. Dovrei anche verificare l'algoritmo del codice sorgente e le ottimizzazioni utilizzate dal build C ++ per l'elaborazione grafica. Alcuni "speed-up" funzionano bene per le app a thread singolo disattivando le cose che potresti voler usare in situazioni multi-thread.

Poiché la tua macchina è un server, potrebbe non avere una CPU grafica. Potrebbe valere la pena considerare un ferro specializzato per elaborare questa roba. Di solito si tratta di quanto vuoi performance e quanto vuoi spendere (tempo, pensiero, denaro, risorse) per ottenerlo.

Altre cose da considerare sono librerie di elaborazione alternative che potrebbero essere più veloci o avere opzioni di configurazione più adatte. Puoi ri-strutturare il tuo codice per sfruttare al meglio il modo di fare le cose della biblioteca?

Se puoi identificare uno o più colli di bottiglia nel tuo codice di trasformazione - Questo può essere fatto con un profiler C ++ - Quindi potresti essere in grado di eseguire le singole trasformazioni in modo sfalsato in modo che tutto il through-put è migliorato Questo è un grande "IF", ma vale la pena menzionarlo.

PRIMA però, prima di impegnarsi più di un giorno in più su questo; controlla con il tuo "responsabile del processo aziendale" e scopri esattamente qual è il numero "OK" di secondi. Se dicono 17 secondi, stai guardando bene, fai la coda e fai in modo che l'utente si cimenta con qualcos'altro sulla pagina.

Sarò interessato a sapere se i processi in serie sono più veloci di 2 in parallelo.

Buona fortuna

    
risposta data 15.03.2014 - 12:46
fonte

Leggi altre domande sui tag