Domanda

Ho un'applicazione di serie che ho parallelizzata usando OpenMP. Ho semplicemente aggiunto il seguente al mio ciclo principale:

#pragma omp parallel for default(shared)
for (int i = 0; i < numberOfEmitters; ++i)
{
    computeTrajectoryParams* params = new computeTrajectoryParams;
            // defining params...
    outputs[i] = (int*) ComputeTrajectory(params);

    delete params;
}

Sembra funzionare bene: all'inizio, tutti i miei thread di lavoro eseguire un'iterazione del ciclo, tutto va veloce, e ho un carico della CPU al 100% (su una macchina quad-core). Tuttavia, dopo un momento, uno dei thread di lavoro si ferma, e rimane in una funzione chiamata _vcomp::PersistentThreadFunc da vcomp90.dll (il file è vctools\openmprt\src\ttpool.cpp), e poi un altro, ecc ... fino a quando solo il thread principale rimane di lavoro.

Qualcuno ha un idea del perché questo accade? Questo comincia ad accadere dopo circa la metà delle iterazioni sono stati eseguiti.

È stato utile?

Soluzione

Potrebbe dipendere dal regime di pianificazione, e la dimensione di calcolo in ogni ciclo. Se la programmazione è statico - ogni thread viene assegnato con il lavoro prima che venga eseguito. Ogni thread otterrà 1/4 degli indici. E 'possibile che alcuni fili terminare prima degli altri perché il loro lavoro è più facile di quello di altri thread (o forse sono poco meno caricato con le altre cose).

Prova a lavorare con la pianificazione dinamica, e vedere se funziona meglio.

Altri suggerimenti

Little commento sul vostro codice: se il tempo di esecuzione del ComputeTrajectory è misurato in ms e si dispone di più di un paio di iterazioni, si dovrebbe davvero fare in modo di avere un allocatore di memoria che è ottimizzato MP, perché si alloca in ogni iterazione e ( ancora oggi) la maggior parte dei ripartitori hanno un pool globale con un blocco globale.

Si potrebbe anche guardare in ricevendo l'assegnazione fuori dal giro del tutto, ma non c'è abbastanza informazioni per sapere se è possibile qui.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top