Sparse matrices todo list
- vyjasnit si rvalue references a implementovat move constructor, move assignment operator
- definovat a otestovat (benchmarkem) základní operátory (+, -, *scalar, *vector, ...) pomocí move konstructoru/přiřazení
- zúplnit + otestovat + benchmarkovat kopírování mezi jednotlivými formáty a různými Device - bylo by hezké, kdyby to šlo udělat pomocí přiřazovacího operátoru (kdysi jsem napsal funkci
copySparseMatrix
- vizSparse{,_impl}.h
) - kernely pro násobení řídkých matic (v ILU se dá struktura pro zaplnění určit pomocí mocnin binární matice - powers of binary matrix (PBM) strategie - mám na to nějaký článek) (a taky se to hodí v multigridu)
- výpočet maticových norem (hodilo by se např. pro testování
||A - LU||
kde LU je neúplný rozklad) - nějak promyslet
MatrixOperations
(třída pro operace nezávislé na formátu matice)- smysl je oddělit high-level algoritmy (=matematika) od storage a základních operací
- solvery pro trojúhelníkové matice - sekvenční algoritmy jsou natvrdo v ILU0 (algoritmy pro CUDA jsou ale na samostatné téma...)
- husté matice by měly být použitelné i v CUDA kernelech
- proxy třídy pro submatice (např. diagonální blok - hodí se v distribuovaných výpočtech)
- proxy třídy pro trojúhelníkové submatice (a navíc implicitní 1 na diagonále) - aby se daly ukládat faktory L a U "v jednom" a použít na ně trojúhelníkový solver
- transpozice - jednak proxy, ale i materializovaná
- Pro husté matice se dá zjednodušit přístup k prvkům pomocí
operator()
místogetElementFast
/setElementFast
(běžně se to používá v lepších knihovnách). Pro řídké matice by se takto dal zjednodušit read-only přístup, ale asi ne zápis (nelze vrátit referenci na neexistující prvek). I když, aktuální implementacesetElementFast
stejně funguje z kernelu jen když se nemusí měnit sloupcový index, takže by se klidně mohl používatoperator()
i pro přepsání existující hodnoty... - metoda
getRowLength
vrací číslo včetně padding zeros u ellpack formátů, což je nešikovné - často se hodí znát přesně reálnou délku řádku. Chtělo by to buď ukládat nebo umět rychle spočítat. Rozhodně je to potřeba pro metodugetCompressedRowLengths
... - implementovat
MatrixTypeResolver
pro načítání matic ze souboru (analogie kMeshTypeResolver
) - bug: některé atributy nejsou inicializované pro matice načtené ze souboru (např.
getMaxRowLength()
vrací 0, protože se nevolala metodasetCompressedRowLengths
) - implementovat
tnl-matrix-converter
- nástroj pro konverzi mezi libovolnými maticovými formáty - hodilo by se hlavně pro export do texťáků (gnuplot a mtx) - implementovat metodu pro seřazení hodnot v každém řádku dle sloupcových indexů (viz https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.csr_matrix.sort_indices.html)
Edited by Jakub Klinkovský