2016-05-23 12 views
2

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スレッドの数を変更することです。

答えて

0

最後のバージョンのMKLであなたの例を確認できますか?私はMKL 11.3.2でそれを実行し、100Mの行列に対して正しく渡しました。しかし、マシンのスレッド数に依存する可能性があります(マルチスレッドのマルチスレッド数は最大intより小さくなければなりません)。このような問題を避けるために、ilp64版のMKLライブラリを使用することを強くお勧めします。 ありがとう、 Alex

関連する問題