Es ist wahrscheinlich, dass diese Informationen nur für die Berechnung von Capabality 1.x oder Cuda 2.0 gelten. Neuere Architekturen und cuda 3.0 verfügen über einen ausgefeilteren globalen Speicherzugriff, und tatsächlich werden "verschmolzene globale Lasten" für diese Chips nicht einmal profiliert.
Diese Logik kann auch auf den gemeinsam genutzten Speicher angewendet werden, um Bankkonflikte zu vermeiden.
Eine Koaleszenzspeichertransaktion ist eine Transaktion, bei der alle Threads in einem Half-Warp gleichzeitig auf den globalen Speicher zugreifen. Dies ist zu einfach, aber der richtige Weg, dies zu tun, besteht darin, aufeinanderfolgende Threads auf aufeinanderfolgende Speicheradressen zugreifen zu lassen.
Wenn die Threads 0, 1, 2 und 3 den globalen Speicher 0x0, 0x4, 0x8 und 0xc lesen, sollte dies ein zusammengeführtes Lesen sein.
Denken Sie in einem Matrixbeispiel daran, dass sich Ihre Matrix linear im Speicher befinden soll. Sie können dies tun, wie Sie möchten, und Ihr Speicherzugriff sollte die Anordnung Ihrer Matrix widerspiegeln. Also die 3x4 Matrix unten
0 1 2 3
4 5 6 7
8 9 a b
könnte Zeile für Zeile so gemacht werden, so dass (r, c) dem Speicher zugeordnet wird (r * 4 + c)
0 1 2 3 4 5 6 7 8 9 a b
Angenommen, Sie müssen einmal auf das Element zugreifen und sagen, Sie haben vier Threads. Welche Threads werden für welches Element verwendet? Wahrscheinlich auch nicht
thread 0: 0, 1, 2
thread 1: 3, 4, 5
thread 2: 6, 7, 8
thread 3: 9, a, b
oder
thread 0: 0, 4, 8
thread 1: 1, 5, 9
thread 2: 2, 6, a
thread 3: 3, 7, b
Welches ist besser? Was führt zu verschmolzenen Lesevorgängen und was nicht?
In beiden Fällen führt jeder Thread drei Zugriffe durch. Schauen wir uns den ersten Zugriff an und sehen, ob die Threads nacheinander auf den Speicher zugreifen. Bei der ersten Option ist der erste Zugriff 0, 3, 6, 9. Nicht aufeinanderfolgend, nicht zusammengeführt. Die zweite Option ist 0, 1, 2, 3. Aufeinander! Verschmolzen! Yay!
Der beste Weg ist wahrscheinlich, Ihren Kernel zu schreiben und ihn dann zu profilieren, um festzustellen, ob Sie nicht zusammengeführte globale Lasten und Speicher haben.
thread 0: 0, 1, 2 etc...
), daher suche ich jetzt nach einer besseren Option :-)