5

Heute habe ich ein anderes Verständnis mit meinem Professor in der Parallel Programming Klasse, über was ist "falsches Teilen". Was mein Professor gesagt hat macht wenig Sinn, also habe ich sofort darauf hingewiesen. Sie dachte, "falsches Teilen" würde zu einem Fehler im Programm führen.Was ist "falsches Teilen"? Wie man es reproduziert/vermeidet?

Ich sagte, "false sharing" passiert, wenn verschiedene Speicheradresse der gleichen Cache-Zeile zugeordnet sind, Schreiben von Daten zu einem davon wird dazu führen, dass ein anderer aus dem Cache geworfen wird. Wenn die Prozessoren zwischen den beiden falschen Freigabeadressen hin- und herschalten, können beide nicht im Cache bleiben, so dass alle Operationen zum Zugriff von DRAMs führen.

Das ist meine Meinung so weit. In der Tat bin ich mir auch nicht sicher, was ich gesagt habe ... Wenn ich ein Missverständnis habe, dann weise es bitte darauf hin.

So gibt es einige Fragen. Es wird angenommen, dass der Cache 64 Byte ausgerichtet ist, 4-Wege-assoziativ.

  1. Ist es möglich, dass zwei Adressen, die durch mehr als 64 Bytes getrennt sind, "false sharing" sind?
  2. Ist es möglich, dass ein einzelnes Thread-Programm ein "falsches Teilen" Problem festgestellt?
  3. Was ist das beste Codebeispiel zum Reproduzieren der "falschen Freigabe"?
  4. Im Allgemeinen, was sollte beachtet werden, um "falsches Teilen" für Programmierer zu vermeiden?

Antwort

2

Ich teile meine Sicht auf Ihre Fragen.

  1. Zwei Adressen, die durch mehr Bytes als die Blockgröße getrennt sind, befinden sich nicht auf derselben Cachezeile. Wenn also ein Kern die erste Adresse in seinem Cache hat und ein anderer Kern die zweite Adresse anfordert, wird der erste wegen dieser Anfrage nicht aus dem Cache entfernt. So wird ein falscher Sharing-Miss nicht auftreten.

  2. Ich kann mir nicht vorstellen, wie falsch geteilt wird, wenn es überhaupt keine Parallelität gibt, da es niemanden außer dem einzigen Thread geben wird, der um die Cache-Zeile konkurriert.

  3. von here Genommen mit OpenMP, ein einfaches Beispiel False Sharing zu reproduzieren wäre:

    double sum=0.0, sum_local[NUM_THREADS]; 
    
    #pragma omp parallel num_threads(NUM_THREADS) 
    { 
        int me = omp_get_thread_num(); 
        sum_local[me] = 0.0; 
    
        #pragma omp for 
        for (i = 0; i < N; i++) 
         sum_local[me] += x[i] * y[i]; 
    
        #pragma omp atomic 
        sum += sum_local[me]; 
    } 
    
  4. Einige allgemeine Noten, die ich denken kann False Sharing zu vermeiden wäre:

    a. Verwenden Sie so oft wie möglich private Daten.

    b. Manchmal können Sie padding verwenden, um Daten auszurichten, um sicherzustellen, dass sich keine anderen Variablen im selben Cache befinden, in dem sich gemeinsame Daten befinden.

Jede Korrektur oder Ergänzung ist willkommen.