Neue CUDA-Optimierung beschleunigt get_rows in llama.cpp um 27 %

imagem 7

Leistungsoptimierung für get_rows im CUDA-Backend

Aktuelle CUDA-Optimierung: Die get_rows-Operation für gleichartige Datentypen wurde durch Vektorisierung mit int4-Kopien beschleunigt. Bisher kopierte k_get_rows_float jedes Element einzeln pro Thread und berechnete für jedes Element die zeileninvarianten Arbeiten neu. Diese redundanten Berechnungen wurden nun aus der Schleife herausgehoben. Für den Fall identischer Quell- und Zieltypen ohne Konvertierung wurde ein neuer vektorisierter Pfad (k_get_rows_float_vec) hinzugefügt, der pro Thread ein int4 (16 Byte) kopiert. Die Vektorisierung wird sowohl zur Kompilierzeit (is_same) als auch zur Laufzeit aktiviert, sofern Basiszeiger und Zeilenabstände 16-Byte-ausgerichtet sind und ne00 durch VEC teilbar ist. Da die Vektorisierung die Blockanzahl reduziert, könnte ein kleiner Gather mit nur einer Zeile die Auslastung der Recheneinheiten verringern; daher sorgt eine Auslastungsprüfung dafür, dass in solchen Fällen der skalare Pfad mit mehr Blöcken verwendet wird. Auf einer Strix Halo (gfx1151) sank die Latenz des DeltaNet-Zustands-Gathers (ne00=524288) von 18,6 µs auf 13,0 µs (gemessen mit rocprofv3), womit die Operation schneller als im Vulkan-Backend ist, ohne Einbußen beim kleinen Conv-Zustands-Gather. Insgesamt verbessert sich get_rows um 27 %. Die Tests für GET_ROWS im Backend-Test bestehen weiterhin vollständig (47/47).

Verfügbare Downloads

Webseite:

macOS/iOS:

Linux:

Android:

Windows:

openEuler:

  • Deaktiviert
  • openEuler x86 (310p)
  • openEuler x86 (910b, ACL Graph)
  • openEuler aarch64 (310p)
  • openEuler aarch64 (910b, ACL Graph)

UI:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert