100Mの行/列の数のCSRマトリックスにMKLスパースBLASを使用しようとしています。 10Mの行/列に対してうまく動作するように見える私のソースコードは、100Mに増やすとsegfaultで失敗します。MKL 100M行のCSRを転置するときのスパースBLASセグメンテーション
Iは、次のコードスニペットに問題を単離した:
void TestSegfault1() {
float values[1] = { 1.0f };
int col_indx[1] = { 0 };
int rows_start[1] = { 0 };
int rows_end[1] = { 1 };
// Step 1. Create 1 x 100M matrix
// with single non-zero value at (0,0)
sparse_matrix_t A;
mkl_sparse_s_create_csr(
&A, SPARSE_INDEX_BASE_ZERO, 1, 100000000,
rows_start, rows_end, col_indx, values);
// Step 2. Transpose it to get 100M x 1 matrix
sparse_matrix_t B;
mkl_sparse_convert_csr(A, SPARSE_OPERATION_TRANSPOSE, &B);
}
mkl_sparse_convert_csrこの機能セグメンテーション違反は、わずかに異なるコード(しかし、本質的に同じ)のためのバックトレース
#0 0x00000000004c0d03 in mkl_sparse_s_convert_csr_i4_avx()
#1 0x0000000000434061 in TestSegfault1()
と、それはもう少しを有します詳細:
#0 0x00000000008fc09b in mkl_serv_free()
#1 0x000000000099949e in mkl_sparse_s_export_csr_data_i4_avx()
#2 0x0000000000999ee4 in mkl_sparse_s_convert_csr_i4_avx()
どうやら何かがメートルに悪い行きますエモリー配分。そして、それは確かに外部から何らかの整数オーバーフローのように見えます。私が持っているMKLのビルドは、MKL_INT = int = int32を使用します。
スパースBLAS CSRマトリクスでは、行数の制限は実際にはありますか< 100M(〜65Mとよく似ています)ですか?それとも間違っているのですか?
EDIT 1: MKLのバージョン文字列は「インテル(R)64アーキテクチャー・アプリケーション用のインテル(R)数学カーネル・ライブラリー・バージョン11.3.1製品ビルド20151021」です。
EDIT 2:それがわかりました。スレッドごとの内部バッファーにメモリーを割り当てるときは、実際には微妙な整数オーバーフローがあります。 mkl_sparse_s_export_csr_data_i4_avx内のある時点で(omp_get_max_threads()+ 1)* num_rows * 4バイトを割り当てようとします。その数は32ビット符号付き整数に収まらない。 mkl_serv_mallocを後で呼び出すと、メモリが破壊され、最終的にsegfaultが発生します。可能な解決策の1つは、omp_set_num_threads呼び出しによってOpenMPスレッドの数を変更することです。