IMAXでGNNを実装するプロジェクト。
GCN
make imax_gcn
SpMMテスト
make test_sparse
MMテスト
make test_dense
EMAX7用はターゲットに.emax7や.emax7+dmaを追加すればコンパイルできる。EMAX6も同様。
ただし、EMAX6はオプションとしてEMAX_VER=6
を追加する必要がある。
なお、他アーキテクチャの場合、
CPUONLY=1
CUDA=1
と設定する。そのままでは行列が大きすぎるため、疎行列も密行列も前処理として分割を行っている。
変換関数内で実装されているため、utils.h
内の関数を用いて変換することができる。
imax_sparse_allocation(IMAXSparseMatrix*)
メモリ割当を行う。IMAX形式に変換されたものを移し替えているだけなので、予め下記の関数を用いて変換を行う必要がある。
convert_imax_sparse_matrix(IMAXSparseMatrix*,SparseMatrix*)
SparseMatrixをIMAXSparseMatrixに変換する関数。 ホストにメモリ割り当てを行い、IMAXSparseMatrixのデータを格納する。
imax_dense_allocation(IMAXDenseMatrix*)
メモリ割当を行う。
convert_imax_dense_matrix(IMAXDenseMatrix*,DenseMatrix*)
DenseMatrixをIMAXDenseMatrixに変換する関数。 移し替えのみなので、先にIMAXにメモリを割当ておいてから呼び出すこと。
convert_dense_matrix(IMAXDenseMatrix*,DenseMatrix*)
IMAXDenseMatrixをDenseMatrixに変換する関数。 移し替えのみなので、先にIMAXにメモリを割当ておいてから呼び出すこと。
imax_sparse_format_init(IMAXSparseMatrix*,int,int,int,int)
IMAXSparseMatrixを初期化する関数。後述の関数では初期化できないので、この関数を用いて初期化する必要がある。
imax_matrix_init_spmm(IMAXDenseMatrix*,IMAXSparseMatrix*,IMAXDenseMatrix*)
SpMM演算を行うIMAXDenseMatrixを初期化する関数。 メモリ割り当ては行われないので、あらかじめメモリを割り当てておく必要がある。
imax_matrix_init_mm(IMAXDenseMatrix*,IMAXDenseMatrix*,IMAXDenseMatrix*)
MM演算を行うIMAXDenseMatrixを初期化する関数。 メモリ割り当ては行われないので、あらかじめメモリを割り当てておく必要がある。
基本46個または20個の疎行列の列データを持ってきて実行する形になっている。 IMAX的なSIMD実装になっているため多少特殊な行列の変換を前処理として行わなければならない。 IMAX2においてのGCN向けの要素数が多いときに最適化されたカーネルになっている。
spmm(IMAXDenseMatrix*,IMAXSparseMatrix*,IMAXDenseMatrix*)
SpMMを行うカーネル。
mm(IMAXDenseMatrix*,IMAXDenseMatrix*,IMAXDenseMatrix*)
MMを行うカーネル。