5.3 CUSP

CUSP - это библиотека для C++ с открытыми исходными кодами общих параллельных алгоритмов для решения СЛАУ с разреженными матрицами при помощи технологии CUDA на графических ускорителях. Библиотека обеспечивает гибкий, высокоуровневый интерфейс для работы с разреженными матрицами и решения СЛАУ.

Форматы разреженных матриц

CUSP поддерживает основные форматы задания разреженных матриц:

1.
координатный (COO),
2.
сжатый (CSR),
3.
диагональный (DIA),
4.
ELL,
5.
гибридный (HYB).

Преобразование форматов

CUSP позволяет обмениваться данными между видеокартой и ЦП, и преобразовывать форматы матриц. Например:

CUSP::csr_matrix<int,float,CUSP::host_memory> A(5,8,12);

выделяет память на ЦП для матрицы в формате CSR размерности 5 на 8 с 12 ненулевыми элементами. После инициализации матрицы можно скопировать ее на видеокарту:

CUSP::csr_matrix<int,float,CUSP::device_memory> B = A;

или поменять формат:

CUSP::hyb_matrix<int,float,CUSP::device_memory> C = A;

до того как скопировать на видеокарту.

Пример

Создадим матрицу в гибридном формате (HYB), скопируем ее на видеокарту, зададим вектор-столбец правой части, полученное СЛАУ Ax = b решим методом Cопряженных градиентов.

#include<CUSP/hyb_matrix.h> 
#include<CUSP/io/matrix_market.h> 
#include<CUSP/krylov/cg.h> 
int main(void) 
{ 
    // создадим пустую матрицу (гибридный формат) 
    CUSP::hyb_matrix<int, float,CUSP::device_memory>A; 
 
    // заполним ее данными из mtx-файла 
    CUSP::io::read_matrix_market_file(A,"5pt_10x10.mtx"); 
 
    // выделим память для для решения x и вектора правой части b 
    CUSP::array1d<float, CUSP::device_memory>x(A.num_rows,0); 
    CUSP::array1d<float, CUSP::device_memory>b(A.num_rows,1); 
 
    // решим полученную СЛАУ A*x=b методом Сопряженных градиентов 
    CUSP::krylov::cg(A, x, b); 
 
    return 0; 
}