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.