La serializzazione della memoria globale simultanea accede a un indirizzo si verifica quando ci sono livelli di cache L1 e L2?

StackOverflow https://stackoverflow.com//questions/20014054

  •  21-12-2019
  •  | 
  •  

Domanda

Sulla base di quello che so, quando i thread di un ordito accedono allo stesso indirizzo nella memoria globale, le richieste vengono serializzate quindi è meglio usare la memoria costante.La serializzazione degli accessi di memoria globali simultanei si verifica quando la GPU è dotata dei livelli di cache L1 e L2 (in Fermi e architettura Keplero)?In altre parole, quando i thread di un ordito accedono allo stesso indirizzo globale di memoria, i 31 fili di un ordito beneficiano dell'esistenza della cache perché 1 thread ha già richiesto tale indirizzo?Cosa succede quando l'accesso è una lettura e anche quando Access è una scrittura?

È stato utile?

Soluzione

Gli accessi globali simultanei allo stesso indirizzo da fili nello stesso ordito di Fermi e Keplero non vengono serializzati. The Warp Leggi ha un meccanismo di trasmissione che soddisfa tutte le letture tali da un singolo cacheline lettura senza un impatto sulle prestazioni. Le prestazioni sono le stesse come se fosse una lettura completamente coalescata. Questo è vero indipendentemente dalle specifiche della cache, ad esempio è vero anche se la cache L1 è disabilitata.

Le prestazioni delle scritture simultanee non sono specificate (AFAIK) ma comportamentale , scrive simultanee vengono sempre serializzate e l'ordine non è definitivo.

Modifica Rispondendo a ulteriori domande seguenti:

.
    .
  1. Anche se tutte le discussioni nel warp scrivono lo stesso valore nello stesso indirizzo, viene serializzato? Non c'è un meccanismo di trasmissione scriva che riconosce tale situazione?

Non c'è un meccanismo di trasmissione di scrittura che guarda tutte le scritture simultanee per vedere se sono tutti uguali, e poi prendono qualche azione basata su questo. La risposta corretta è che le scritture si verificano in ordine non specificato e le caratteristiche di prestazione sono indefinite. Ovviamente, se tutti i valori scritti sono gli stessi, puoi essere certo che il valore che finisce nella posizione sarà quel valore. Ma se stai chiedendo se l'attività di scrittura è crollata a un singolo ciclo o richiede più cicli da completare, che il comportamento effettivo non è definito (non documentato) e infatti potrebbe varia da un'architettura al successivo ( Ad esempio, cc1.x può serializzare in modo tale da essere eseguito tutte le scritture, mentre CC2.x può "serializzare" in modo tale da scrivere "vince" e tutti gli altri vengono scartati, non consumando cicli effettivi.) Ancora una volta, la prestazione non è documentata / non specificata, ma il comportamento osservabile del programma è definito.

.

2 Con questo meccanismo di trasmissione che hai spiegato, l'unica differenza tra l'accesso alla trasmissione della memoria costante e l'accesso alla trasmissione della memoria globale è che il primo può indirizzare l'accesso fino alla memoria globale, ma quest'ultimo ha un hardware dedicato ed è più veloce , giusto?

La memoria __constant__ utilizza la cache costante, che è un pezzo di hardware dedicato disponibile su base per-sm e memorizza nella cache una particolare sezione della memoria globale in A Lettura-solo Moda. Questa cache HW è fisicamente e logicamente separata dalla cache L1 (se esiste ed è abilitata) e la cache L2. Per Fermi e oltre, entrambi i meccanismi supportano la trasmissione su lettura, e per la cache costante, questo è il modello di accesso preferito, poiché la cache costante può solo il servizio di un accesso alla lettura per ciclo (cioè non supporta un'intera cachelica letta da un ordito). Entrambi i meccanismi possono "colpire" nella cache (se presente) o "signorina" e innescare una lettura globale. Nella prima lettura di una determinata posizione (o cacheline), Niether Cache avrà i dati richiesti, e quindi "manca" e attiverà una memoria globale di memoria, per avviare l'accesso. Successivamente, in entrambi i casi, le letture successive saranno revisionate dalla cache, supponendo che i dati rilevanti non vengano sfrattati nell'integro. Per i primi dispositivi CC1.x, la cache di memoria costante è stata piuttosto preziosa poiché quei primi dispositivi non avevano una cache L1. Per Fermi e oltre il principale motivo per utilizzare la cache costante sarebbe se sono disponibili dati identificabili (ad esempio sola lettura) e gli schemi di accesso (lo stesso indirizzo per curvatura) sono disponibili, quindi utilizzare la cache costante impedirà a quelle letture da viaggiare attraverso L1 e possibilmente espulsione di altri dati. In effetti si sta aumentando un po 'la cache, in un po', oltre a ciò che il L1 può supportare da solo.

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