Una condizione di gara senza downside è ancora una condizione di gara?

3

Sto scrivendo un pezzo di codice che prende la differenza tra due numeri, trova quella posizione nella memoria e quindi imposta la posizione su true.

Attualmente il mio metodo per eseguire questo è il seguente. Nota la funzione i_jlocation fa solo il confronto.

    #pragma omp parallel for collapse(2)
    for(int particleRow = 0; particleRow < numberOfDipolesI; particleRow++)
    {
        for(int particleColumn = 0; particleColumn < numberOfDipolesJ; particleColumn++)
        {
            int ijx , ijy , ijz;
            //
            // Find location
            //
            i_jlocation(objData.dimensions,dipolePositionsI,dipolePositionsJ,particleRow,particleColumn,&ijx,&ijy,&ijz);

            int truePos = ijx*2*2*objData.dimensions[1]*objData.dimensions[2]+ijy*2*objData.dimensions[2]+ijz;
            //#pragma omp critical (flipCrit)
            {
                temp[truePos] = true;
            }

        }
    }

Ora in questo pezzo di codice riconosco che se devo scrivere fedelmente a quel blocco di dati, ci sono molte combinazioni possibili di particleRow e particlecolumn che potrebbero portare a una condizione di competizione in qualsiasi cella di memoria. Se uso la sezione critica di cui sopra, il codice impiegherà circa 180 secondi per completare l'uso di 12 core, mentre senza una sezione critica è di ~ 5 secondi. Ora dalla mia comprensione di una condizione di competizione si ottengono gare di scrittura-scrittura e lettura-scrittura che potrebbero causare problemi se i dati diversi vengono inseriti / letti. Tuttavia, posso garantire che i dati da inserire sempre siano stessi . Ciò significa che indipendentemente dall'ordine in cui questo si verifica, il risultato non cambierà mai.

Questo sarebbe considerato un tempo accettabile per ignorare una condizione di competizione? Personalmente ritengo che ciò non sia accettabile, ma sto cercando di trovare un modo algoritmico per evitare di colpire due volte la stessa cella, e l'aumento di velocità è una necessità dovuta alla natura HPC del problema che sto cercando di affrontare.

    
posta Hobojoe 12.12.2018 - 18:38
fonte

1 risposta

8

Se sei sicuro che il risultato sia coerente, allora è perfettamente corretto farlo. Hai raggiunto una delle principali strategie per migliorare la concorrenza, in effetti. Eliminare i blocchi è una chiave per migliorare le prestazioni degli algoritmi concorrenti. Un approccio che consente a questo è di progettare le cose per essere tolleranti alle condizioni di gara. Ad esempio, se è possibile organizzare le cose in modo che non importa se un thread sovrascrive il risultato di un altro, allora si è evitato il bisogno di un blocco. Non dovresti sentirti male per questo. È un risultato.

Non ho valutato se questo è corretto. Se c'è un sottile difetto nel tuo ragionamento, potrebbe rendere il tuo algoritmo errato / instabile. Il test purtroppo non è abbastanza buono per questo genere di cose.

    
risposta data 12.12.2018 - 18:47
fonte

Leggi altre domande sui tag