Mein CUDA-Programm leidet unter unkoalesziertem globalen Speicherzugriff. Obwohl der idx-te Thread nur die [idx] -te Zelle in einem Array behandelt, gibt es viele indirekte Speicherzugriffe, wie unten gezeigt.Unkoalestiger globaler Speicherzugriff, der durch indirekten Zugriff in CUDA verursacht wird
int idx=blockDim.x*blockIdx.x+threadIdx.x;
.... = FF[m_front[m_fside[idx]]];
Für m_fisde [idx], wir haben Zugriffe koalesziert, aber was wir wirklich brauchen, ist FF [m_front [m_fside [idx]]]. Es gibt einen indirekten Zugang auf zwei Ebenen.
Ich habe versucht, einige Muster der Daten in m_front oder m_fsied zu finden, um dies zu einem direkten sequentiellen Zugriff zu machen, aber herausgefunden, dass sie fast "zufällig" sind.
Gibt es eine Möglichkeit, dies anzugehen?
Dies ist tatsächlich das gleiche Problem wie die Adressierung von Sparse-Matrix, und es hat ziemlich viel Arbeit getan, um zu verstehen, wie man das verbessert. Sie könnten einige Ideen aus der Literatur über Sparse Matrix Operationen auf GPUS bekommen. – talonmies
Wenn es einen Ort in den Zugängen gibt, könnte [diese Frage] (http://stackoverflow.com/questions/12938333/coalesced-global-memory-writes-using-hash/12938726#12938726) von Interesse sein. –
@RobertCrovella ... Der Link ** Texture Mechanism ** in der obigen verknüpften Antwort ist abgelaufen. Können Sie den Link bitte aktualisieren? – sgarizvi