Dokumentation / DeutschQuelltext ansehen ↗

ruSPARSE Benutzerhandbuch

English | 简体中文 | 日本語 | Deutsch | Русский

Computerbibliotheken · 中文

1. Übersicht

ruSPARSE bietet eine spärliche Berechnung.

2. Datendeskriptoren

Typ Zweck
CsrMatrix, CsrMatrixOwned Geliehene CSR-Ansichten und eigener Speicher
CooMatrix, CooMatrixOwned COO Darstellung
CscMatrix, CscMatrixOwned CSC Darstellung
BsrMatrix, EllMatrix Blockiert spärliche und ELL-Darstellungen
DenseMatrix, DenseMatrixOwned Dichte Matrixdeskriptoren
SparseVector Sparse-Vektor
IndexBase Indexbasis Zero oder One
DenseOrder RowMajor oder ColumnMajor
Operation None, Transpose oder ConjugateTranspose

Indexbasis, Layout und Operationstyp sind explizite Verträge und können nicht allein aus Array-Längen abgeleitet werden. „Eigentümer“ unterscheidet eigene Daten von geliehenen Ansichten; Der allgemeine GPU-Speicher wird nicht automatisch zugewiesen.

3. Operationen

Operationen sind in Matrix-Vektor-Multiplikation, Matrix-Multiplikation, dünn besetzte Matrix-Multiplikation/Addition, dünn besetzte Vektorpunktprodukte, SDDMM und Formatkonvertierung unterteilt. Die Ausführungsschicht enthält SparsePlan, SparseError und vorgangsspezifische Ergebnistypen.

CSR Matrix-Vektor-Multiplikation verwendet den Alpha-, Op(A)-, X-, Beta- und Y-Vertrag. Passen Sie beim Portieren eines Anrufs die Indexbasis, den Transpositionsmodus und das Datenlayout an, anstatt nur das Bibliothekspräfix zu ändern.

4. CUDA CSR Matrix-Vektor-Multiplikation

Das Cargo-Paket ist ruSPARSE; Der Rust-Importname lautet rusparse. Funktion tensor ermöglicht rusparse::tensor; cuda ermöglicht sowohl Gerätetensoren als auch CUDA-Abhängigkeiten. Vom Quellstammverzeichnis ausführen:

cargo run --locked -p ruSPARSE --features cuda --example csrmv

Dieses Beispiel berechnet 0.5 × A × x + 2 × y:

use ruda_core::tensor::data::TensorData;
use ruda_driver_cuda::{CudaDevice, CudaRuntime};
use ruda_kernel::tensor::{readback::into_data_sync, transfer::from_data};
use rusparse::{
    CsrMatrix, IndexBase, Operation,
    tensor::{CsrTensor, csrmv},
};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let device = CudaDevice::default();
    let host = CsrMatrix::new(
        3, 3,
        &[0, 2, 3, 4],
        &[0, 1, 1, 2],
        &[2., 1., -1., 5.],
        IndexBase::Zero,
    )?;
    let matrix = CsrTensor::<CudaRuntime>::from_csr(host, Operation::None, &device)?;
    let x = from_data(TensorData::new(vec![3f32, 4., 5.], [3]), &device);
    let y = from_data(TensorData::new(vec![1f32, 2., 3.], [3]), &device);
    let output = into_data_sync(csrmv(&matrix, 0.5, x, 2., y)?).to_vec::<f32>()?;
    assert_eq!(output, [7., 2., 18.5]);
    println!("alpha * A * x + beta * y = {output:?}");
    Ok(())
}

Die Argumente für CsrMatrix::new sind Zeilen, Spalten, Zeilenoffsets, Spaltenindizes, Werte ungleich Null und Indexbasis. In der ersten Zeile werden zwei Einträge gespeichert. der zweite und der dritte speichern jeweils einen. Das Ergebnis ist [7.0, 2.0, 18.5].

CsrTensor::from_csr lädt Struktur und Werte hoch. Geben Sie hier Operation::Transpose an, um die Matrix zu transponieren. Für csrmv(&matrix, alpha, x, beta, y) entspricht die x-Länge der Spaltenanzahl und die y-Länge der Zeilenanzahl. Dichte Eingaben müssen unquantisierte F32-Tensoren auf dem Matrixgerät sein. Der Aufruf gibt einen neuen Gerätetensor zurück; Für die Wiederverwendung der Matrix ist kein erneutes Hochladen der CSR-Struktur erforderlich.

Für die Multiplikation einer dünn besetzten/dichten Matrix verwenden Sie csrmm(&matrix, operation_b, alpha, b, beta, c, output_order). Hier ist c optional und DenseOrder gibt das Ausgabelayout an. Um nur Werte ungleich Null zu ändern, rufen Sie matrix.with_values(values) mit einem F32-Gerätetensor der Länge nnz auf; Die Struktur bleibt erhalten.

5. CSR im Tensor-Framework

ruda_tensor::api::CsrTensor<B> zielt auf Backends ab, die SparseOps implementieren. Es handelt sich um einen anderen Typ als den oben genannten rusparse::tensor::CsrTensor<R>. Erstellen Sie es mit CsrTensor::<B>::from_data(&data, &device), wobei die Daten den Typ B::CsrData des Backends haben.

Methode Verwendung
matmul(rhs), transpose_matmul(rhs) Multiplizieren Sie die dünn besetzte Matrix oder ihre Transponierte mit einem zweidimensionalen dichten Tensor
sparse_matmul(&rhs) Multiplizieren Sie dünn besetzte Matrizen und erstellen Sie das Ausgabemuster
add(&rhs), add_scaled(&rhs, alpha, beta) Sparse-Matrizen hinzufügen, optional mit Koeffizienten
gather(dense) Sammeln Sie dichte Werte an den CSR-Positionen in einem eindimensionalen Tensor
scatter_add() Gespeicherte Werte zu ihren dichten Positionen hinzufügen
mul_dense(rhs) Mit dichten Werten an den CSR-Positionen multiplizieren
sampled_matmul(lhs, rhs) Bewerten Sie ein dichtes Matrixprodukt nur an den aktuellen CSR-Positionen
sampled_sparse_matmul(&lhs, &rhs) Bewerten Sie ein Sparse-Matrix-Produkt nur an den aktuellen CSR-Positionen
transpose(), to_dense() Transponiert oder konvertiert in einen dichten Tensor
with_values(values) Ersetzen Sie den eindimensionalen Wertetensor unter Beibehaltung der Struktur
to_data().await B::CsrData asynchron zurücklesen

Diese Berechnungsmethoden geben Result zurück. Werttensoren, die in Framework-Sparse-Operationen verwendet werden, müssen unquantisiert sein.

API-Referenz: Gerät CSR, Framework CSR.