Plattform und Quelle
Dieser Artikel basiert auf dem RKNN-V2.5.0-PDF des Herstellers und gilt nur für die dort genannten Chips und Schnittstellen. Bei ArmSoM-Boards zuerst SoC, NPU-Treiber, Toolkit/Runtime, SDK/BSP und Kernelversion prüfen. Eine ArmSoM-Hardwareprüfung wurde nicht durchgeführt; Beispiele und Messwerte stammen aus der Quelle, nicht aus ArmSoM-Tests.
Seriennavigation
- Plattformen, Header und Linken
- Speicherbesitz und allgemeine/Zero-Copy-Abläufe
- Gerät, Kontext und Initialisierungsflags
- Modell-, Tensor- und dynamische Formabfragen
- Eingabe, Ausführung, Ausgabe und dynamische Formen
- Tensorspeicher zuweisen und synchronisieren
- Matrixmultiplikations-APIs und dynamische Formen
- Benutzerdefinierte Operatoren registrieren und abfragen
- Statuscodes, Tensoren, Speicher und Erweiterungstypen
- Strukturen zur Matrixmultiplikation
- Operatortypen und Migration veralteter APIs
5.5. Matrixmultiplikation
Matrixmultiplikationskontext erstellen, Speicher und Quantisierungsparameter setzen, ausführen.
rknn_matmul_create
Die Funktion initialisiert den Matrixmultiplikationskontext anhand der übergebenen Spezifikation und weiterer Informationen. Sie gibt Form, Größe, Datentyp und weitere Attribute der Ein- und Ausgabetensoren zurück. Der Zeiger rknn_matmul_ctx und rknn_context haben hier dieselbe Datenstruktur.
| API | rknn_matmul_create |
|---|---|
| Beschreibung | Initialisiert den Matrixmultiplikationskontext. |
| Parameter | rknn_matmul_ctx* ctx: Zeiger auf den Matrixmultiplikationskontext. |
| Parameter | rknn_matmul_info* info: Zeiger auf die Spezifikationsstruktur der Matrixmultiplikation. |
| Parameter | rknn_matmul_io_attr* io_attr: Zeiger auf die Attributstruktur der Ein-/Ausgabetensoren der Matrixmultiplikation. |
| Rückgabe | int: Fehlercode (siehe Statuscodes). |
Codebeispiel:
rknn_matmul_info info;
memset(&info, 0, sizeof(rknn_matmul_info));
info.M = 4;
info.K = 64;
info.N = 32;
info.type = RKNN_INT8_MM_INT8_TO_INT32;
info.B_layout = RKNN_MM_LAYOUT_NORM;
info.AC_layout = RKNN_MM_LAYOUT_NORM;
rknn_matmul_io_attr io_attr;
memset(&io_attr, 0, sizeof(rknn_matmul_io_attr));
int ret = rknn_matmul_create(&ctx, &info, &io_attr);
if (ret < 0) {
printf("rknn_matmul_create fail! ret=%d\n", ret);
return -1;
}
rknn_matmul_set_io_mem
Die Funktion setzt den Ein-/Ausgabespeicher der Matrixmultiplikation. Zunächst über rknn_create_mem einen rknn_tensor_mem-Zeiger erstellen, dann gemeinsam mit dem von rknn_matmul_create erhaltenen rknn_matmul_tensor_attr-Zeiger für A, B oder C übergeben. Dadurch wird der Speicher im Operationskontext gebunden. Zuvor müssen die Daten von A und B gemäß dem in rknn_matmul_info konfigurierten Speicherlayout vorbereitet werden.
| API | rknn_matmul_set_io_mem |
|---|---|
| Beschreibung | Setzt den Ein-/Ausgabespeicher für Matrixmultiplikation. |
| Parameter | rknn_matmul_ctx ctx: Matrixmultiplikationskontext. |
| Parameter | rknn_tensor_mem* mem: Zeiger auf die Tensorspeicher-Informationsstruktur. |
| Parameter | rknn_matmul_tensor_attr* attr: Zeiger auf die Attributstruktur der Ein-/Ausgabetensoren der Matrixmultiplikation. |
| Rückgabe | int: Fehlercode (siehe Statuscodes). |
Codebeispiel:
// Create A
rknn_tensor_mem* A = rknn_create_mem(ctx, io_attr.A.size);
if (A == NULL) {
printf("rknn_create_mem fail!\n");
return -1;
}
memset(A->virt_addr, 1, A->size);
rknn_matmul_io_attr io_attr;
memset(&io_attr, 0, sizeof(rknn_matmul_io_attr));
int ret = rknn_matmul_create(&ctx, &info, &io_attr);
if (ret < 0) {
printf("rknn_matmul_create fail! ret=%d\n", ret);
return -1;
}
// Set A
ret = rknn_matmul_set_io_mem(ctx, A, &io_attr.A);
if (ret < 0) {
printf("rknn_matmul_set_io_mem fail! ret=%d\n", ret);
return -1;
}
rknn_matmul_set_core_mask
Die Funktion legt die verfügbaren NPU-Kerne für Matrixmultiplikation fest; nur RK3588 und RK3576 werden unterstützt. Zuvor den Kontext mit rknn_matmul_create initialisieren. Der Maskenwert wählt die verwendeten Kerne zur Verbesserung von Leistung und Effizienz der Matrixmultiplikation.
| API | rknn_matmul_set_core_mask |
|---|---|
| Beschreibung | Setzt die NPU-Kernmaske für Matrixmultiplikation. |
| Parameter | rknn_matmul_ctx ctx: Matrixmultiplikationskontext. |
| Parameter | rknn_core_mask core_mask: Maske verfügbarer NPU-Kerne für Matrixmultiplikation. Jedes Bit bezeichnet einen Kern: 1 bedeutet verfügbar, sonst nicht verfügbar. Details siehe Parameter von rknn_set_core_mask. |
| Rückgabe | int: Fehlercode (siehe Statuscodes). |
Codebeispiel:
rknn_matmul_set_core_mask(ctx, RKNN_NPU_CORE_AUTO);
rknn_matmul_set_quant_params
rknn_matmul_set_quant_params setzt die Quantisierungsparameter jeder Matrix für Per-Channel oder Per-Layer. Bei Per-Channel haben scale und zp in rknn_quant_params die Länge N, bei Per-Layer die Länge 1. Die Parameter aller Matrizen sind vor rknn_matmul_run zu setzen. Ohne diesen Aufruf gilt Per-Layer mit scale=1.0 und zero_point=0.
| API | rknn_matmul_set_quant_params |
|---|---|
| Beschreibung | Setzt die Quantisierungsparameter der Matrix. |
| Parameter | rknn_matmul_ctx ctx: Matrixmultiplikationskontext. |
| Parameter | rknn_quant_params* params: Quantisierungsparameter der Matrix. |
| Rückgabe | int: Fehlercode (siehe Statuscodes). |
Codebeispiel:
rknn_quant_params params_a;
memcpy(params_a.name, io_attr.A.name, RKNN_MAX_NAME_LEN);
params_a.scale_len = 1;
params_a.scale = (float *)malloc(params_a.scale_len * sizeof(float));
params_a.scale[0] = 0.2;
params_a.zp_len = 1;
params_a.zp = (int32_t *)malloc(params_a.zp_len * sizeof(int32_t));
params_a.zp[0] = 0;
rknn_matmul_set_quant_params(ctx, ¶ms_a);
rknn_matmul_get_quant_params
rknn_matmul_get_quant_params wird bei rknn_matmul_type=RKNN_INT8_MM_INT8_TO_INT32 und Per-Channel-Quantisierung verwendet, um die normalisierten scale-Werte aller Kanäle von B zu erhalten. Der erhaltene Wert multipliziert mit dem ursprünglichen scale von A ergibt scale von C. Damit lässt sich scale von C näherungsweise bestimmen, wenn kein tatsächlicher Wert vorliegt.
| API | rknn_matmul_get_quant_params |
|---|---|
| Beschreibung | Ruft die Quantisierungsparameter von Matrix B ab. |
| Parameter | rknn_matmul_ctx ctx: Matrixmultiplikationskontext. |
| Parameter | rknn_quant_params* params: Quantisierungsparameter von Matrix B. |
| Parameter | float* scale: Zeiger auf scale von Matrix B. |
| Rückgabe | int: Fehlercode (siehe Statuscodes). |
Codebeispiel:
float b_scale;
rknn_matmul_get_quant_params(ctx, ¶ms_b, &b_scale);
rknn_matmul_create_dyn_shape (veraltet)
Diese Schnittstelle ist veraltet und durch rknn_matmul_create_dynamic_shape ersetzt.
rknn_matmul_create_dynamic_shape
rknn_matmul_create_dynamic_shape erstellt einen Matrixmultiplikationskontext mit dynamischen Formen. Übergeben werden rknn_matmul_info, Formenanzahl und ein entsprechendes Array mehrerer M-, K- und N-Werte. Nach erfolgreicher Initialisierung wird ein rknn_matmul_io_attr-Array mit Form, Größe und Datentyp aller Ein- und Ausgabematrizen zurückgegeben. Im beschriebenen Stand lassen sich mehrere unterschiedliche M, K und N festlegen.
| API | rknn_matmul_create_dynamic_shape |
|---|---|
| Beschreibung | Initialisiert den Matrixmultiplikationskontext mit dynamischen Formen. |
| Parameter | rknn_matmul_ctx *ctx: Zeiger auf den Matrixmultiplikationskontext. |
| Parameter | rknn_matmul_info* info: Zeiger auf die Spezifikationsstruktur der Matrixmultiplikation. M, K und N müssen nicht gesetzt werden. |
| Parameter | int shape_num: Anzahl der vom Kontext unterstützten Formen. |
| Parameter | rknn_matmul_shape dynamic_shapes[]: Array der vom Kontext unterstützten Formen. |
| Parameter | rknn_matmul_io_attr io_attrs[]: Array der Attributstrukturen der Ein-/Ausgabetensoren der Matrixmultiplikation. |
| Rückgabe | int: Fehlercode (siehe Statuscodes). |
Codebeispiel:
const int shape_num = 2;
rknn_matmul_shape shapes[shape_num];
for (int i = 0; i < shape_num; ++i) {
shapes[i].M = i+1;
shapes[i].K = 64;
shapes[i].N = 32;
}
rknn_matmul_io_attr io_attr[shape_num];
memset(io_attr, 0, sizeof(rknn_matmul_io_attr) * shape_num);
int ret = rknn_matmul_create_dynamic_shape(&ctx, &info, shape_num, shapes, io_attr);
if (ret < 0) {
fprintf(stderr, " rknn_matmul_create_dynamic_shape fail! ret=%d\n", ret);
return -1;
}
rknn_matmul_set_dynamic_shape
rknn_matmul_set_dynamic_shape wählt eine bestimmte Form für die Matrixmultiplikation. Nach Erstellung des Kontexts für dynamische Formen eine der rknn_matmul_shape-Strukturen übergeben, um die Form der Operation festzulegen.
| API | rknn_matmul_set_dynamic_shape |
|---|---|
| Beschreibung | Setzt die Matrixmultiplikationsform. |
| Parameter | rknn_matmul_ctx ctx: Matrixmultiplikationskontext. |
| Parameter | rknn_matmul_shape* shape: für die Matrixmultiplikation verwendete Form. |
| Rückgabe | int: Fehlercode (siehe Statuscodes). |
Codebeispiel:
ret = rknn_matmul_set_dynamic_shape(ctx, &shapes[0]);
if (ret != 0) {
fprintf(stderr, "rknn_matmul_set_dynamic_shapes fail!\n");
return -1;
}
rknn_B_normal_layout_to_native_layout
rknn_B_normal_layout_to_native_layout konvertiert die Daten von B aus dem ursprünglichen Layout (KxN) in ein leistungsoptimiertes Datenlayout.
| API | rknn_B_normal_layout_to_native_layout |
|---|---|
| Beschreibung | Konvertiert das Datenlayout von B aus der ursprünglichen in eine leistungsoptimierte Form. |
| Parameter | void* B_input: Zeiger auf die Daten von B im ursprünglichen Layout. |
| Parameter | void* B_output: Zeiger auf die Daten von B im leistungsoptimierten Layout. |
| Parameter | int K: Zeilenanzahl von B. |
| Parameter | int N: Spaltenanzahl von B. |
| Parameter | int subN: entspricht B.dims[2] in rknn_matmul_io_attr. |
| Parameter | int subK: entspricht B.dims[3] in rknn_matmul_io_attr. |
| Parameter | rknn_matmul_info* info: Zeiger auf die Informationsstruktur zur Matrixmultiplikation. |
| Rückgabe | int: Fehlercode (siehe Statuscodes). |
Codebeispiel:
int32_t subN = io_attr.B.dims[2];
int32_t subK = io_attr.B.dims[3];
rknn_B_normal_layout_to_native_layout(B_Matrix, B->virt_addr, K, N, subN, subK, &info);
rknn_matmul_run
Die Funktion führt die Matrixmultiplikation aus und speichert das Ergebnis in C. Zuvor A und B vorbereiten und ihre Eingabepuffer über rknn_matmul_set_io_mem setzen. Auch der Ausgabepuffer von C wird über rknn_matmul_set_io_mem gesetzt; die Ausgabetensorattribute stammen aus rknn_matmul_create.
| API | rknn_matmul_run |
|---|---|
| Beschreibung | Führt eine Matrixmultiplikation aus. |
| Parameter | rknn_matmul_ctx ctx: Matrixmultiplikationskontext. |
| Rückgabe | int: Fehlercode (siehe Statuscodes). |
Codebeispiel:
int ret = rknn_matmul_run(ctx);
rknn_matmul_destroy
Die Funktion zerstört den Matrixmultiplikationskontext und gibt zugehörige Ressourcen frei. Nach Verwendung des durch rknn_matmul_create erstellten Zeigers ist diese Funktion zur Zerstörung aufzurufen.
| API | rknn_matmul_destroy |
|---|---|
| Beschreibung | Zerstört den Matrixmultiplikationskontext. |
| Parameter | rknn_matmul_ctx ctx: Matrixmultiplikationskontext. |
| Rückgabe | int: Fehlercode (siehe Statuscodes). |
Codebeispiel:
int ret = rknn_matmul_destroy(ctx);
Quelle und redaktionelle Hinweise
Technische Kapitel sind nach Anwendung aufgeteilt. Code, Bezeichner und Parameter bleiben erhalten. Chinesisch folgt der chinesischen Quelle, Englisch, Russisch und Deutsch der englischen. Für Kapitel ohne Abbildungen wurden keine erfundenen Bilder hinzugefügt.
Hinweise zur Quelle: Kapitelnummern und Beispielausgaben bleiben erhalten; ältere SDK-Versionen in Protokollen sind nicht die aktuelle Dokumentversion. Die Runtime-Quelle springt von Kapitel 3 zu 5 und wiederholt Abfragenummern. Die rknn_init-Tabelle bezeichnet extend als deaktiviert, spätere Typen beschreiben jedoch user_key und gemeinsame Gewichte. Der Text zur nativen dynamischen Ausgabe nennt RKNN_QUERY_CURRENT_OUTPUT_ATTR, das Beispiel RKNN_QUERY_CURRENT_NATIVE_OUTPUT_ATTR. Einige native NHWC/NC1HWC2-Beschreibungen verwechseln Ein- und Ausgabe. Mit tatsächlichen V2.5.0-Headern und Ziel-SDK abgleichen; das Verhalten wurde nicht getestet. Der RK2118-Verweis heißt im Original RKNN3_RK2118_Quick_Start.pdf, im aktuellen Verzeichnis liegt eine RKNN2-Kurzanleitung.
