ruSPARSE Руководство пользователя
English | 简体中文 | 日本語 | Deutsch | Русский
Вычислительные библиотеки · 中文
1. Обзор
ruSPARSE обеспечивает разреженные вычисления.
2. Дескрипторы данных
| Тип | Цель |
|---|---|
CsrMatrix, CsrMatrixOwned |
Заимствованные представления CSR и собственное хранилище |
CooMatrix, CooMatrixOwned |
COO представление |
CscMatrix, CscMatrixOwned |
CSC представление |
BsrMatrix, EllMatrix |
Разреженные блоки и представления ELL |
DenseMatrix, DenseMatrixOwned |
Дескрипторы плотной матрицы |
SparseVector |
Разреженный вектор |
IndexBase |
База индексов Zero или One |
DenseOrder |
RowMajor или ColumnMajor |
Operation |
None, Transpose или ConjugateTranspose |
База индекса, макет и тип операции являются явными контрактами и не могут быть выведены только на основе длины массива. Owned отличает собственные данные от заимствованных представлений; он не выделяет хранилище общего назначения GPU автоматически.
3. Операции
Операции организованы в умножение матрицы на вектор, умножение матрицы, умножение/сложение разреженной матрицы, скалярное произведение разреженных векторов, SDDMM и преобразование формата. Уровень выполнения содержит SparsePlan, SparseError и типы результатов для конкретных операций.
CSR Умножение матрицы на вектор использует контракт альфа, op(A), x, beta, y. При переносе вызова сопоставьте базу индексов, режим транспонирования и расположение данных, а не просто меняйте префикс библиотеки.
4. CUDA CSR матрично-векторное умножение
Пакет Cargo — ruSPARSE; имя импорта Rust — rusparse. Функция tensor включает rusparse::tensor; cuda поддерживает как тензоры устройств, так и зависимости CUDA. Запускаем из корня исходников:
cargo run --locked -p ruSPARSE --features cuda --example csrmv
В этом примере вычисляется 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(())
}
Аргументами CsrMatrix::new являются строки, столбцы, смещения строк, индексы столбцов, ненулевые значения и база индекса. В первой строке хранятся две записи; второй и третий хранят по одному. Результат: [7.0, 2.0, 18.5].
CsrTensor::from_csr загружает структуру и значения. Укажите здесь Operation::Transpose, чтобы транспонировать матрицу. Для csrmv(&matrix, alpha, x, beta, y) длина x равна количеству столбцов, а длина y равна количеству строк. Плотные входные данные должны быть неквантованными тензорами F32 на устройстве матрицы. Вызов возвращает новый тензор устройства; повторное использование матрицы не требует повторной загрузки ее структуры CSR.
Для умножения разреженной/плотной матрицы используйте csrmm(&matrix, operation_b, alpha, b, beta, c, output_order). Здесь c является необязательным, а DenseOrder определяет макет вывода. Чтобы изменить только ненулевые значения, вызовите matrix.with_values(values) с тензором устройства F32 длины nnz; структура сохранена.
5. CSR в тензорном каркасе
ruda_tensor::api::CsrTensor<B> предназначен для серверных частей, реализующих SparseOps. Это другой тип, чем rusparse::tensor::CsrTensor<R>, описанный выше. Создайте его с помощью CsrTensor::<B>::from_data(&data, &device), где данные имеют тип B::CsrData бэкенда.
| Метод | Использование |
|---|---|
matmul(rhs), transpose_matmul(rhs) |
Умножьте разреженную матрицу или ее транспонирование на двумерный плотный тензор. |
sparse_matmul(&rhs) |
Умножьте разреженные матрицы и создайте выходной шаблон. |
add(&rhs), add_scaled(&rhs, alpha, beta) |
Добавьте разреженные матрицы, опционально с коэффициентами. |
gather(dense) |
Собрать плотные значения в позициях CSR в одномерный тензор. |
scatter_add() |
Добавьте сохраненные значения в их плотные позиции. |
mul_dense(rhs) |
Умножить на плотные значения в позициях CSR. |
sampled_matmul(lhs, rhs) |
Оценить продукт с плотной матрицей только в текущих позициях CSR. |
sampled_sparse_matmul(&lhs, &rhs) |
Оценить продукт с разреженной матрицей только в текущих позициях CSR. |
transpose(), to_dense() |
Транспонировать или преобразовать в плотный тензор |
with_values(values) |
Замените тензор одномерных значений, сохранив структуру. |
to_data().await |
Асинхронное обратное чтение B::CsrData |
Эти методы вычислений возвращают Result. Тензоры значений, используемые в разреженных операциях платформы, должны быть неквантованными.
API Ссылка: Устройство CSR, Рамка CSR.