2016-05-23 9 views
2

Ich versuche, MKL Sparse BLAS für CSR-Matrizen mit einer Anzahl von Zeilen/Spalten in der Größenordnung von 100M zu verwenden. Mein Quellcode, der bei 10M Zeilen/Spalten fehlerfrei zu sein scheint, schlägt mit segfault fehl, wenn ich ihn auf 100M erhöhe.MKL Sparse BLAS segfault beim Transponieren CSR mit 100M Zeilen

isolierte ich das Problem, wie der folgenden Code-Schnipsel:

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); 
} 

Diese Funktion segfaults in mkl_sparse_convert_csr mit Backtrace

#0 0x00000000004c0d03 in mkl_sparse_s_convert_csr_i4_avx() 
#1 0x0000000000434061 in TestSegfault1() 

Für etwas anderen Code (aber im Wesentlichen gleich) es hat ein wenig mehr Detail:

#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() 

Anscheinend geht etwas schlecht in m Emory-Zuweisung. Und es sieht sicher wie eine Art Integer-Überlauf von außen aus. Der Build von MKL Ich verwende MKL_INT = int = int32.

Ist es tatsächlich der Fall und die Grenze für die Anzahl der Zeilen, die ich in Sparse BLAS CSR-Matrix haben kann, ist < 100M (sieht eher aus ~ 65M)? Oder mache ich es falsch?

EDIT 1: MKL Version String ist "Intel (R) Math Kernel Bibliothek Version 11.3.1 Produkt Build 20151021 für Intel (R) 64 Architektur-Anwendungen".

EDIT 2: Es herausgefunden. Es gibt in der Tat eine subtile Art von Integer-Überlauf beim Zuweisen von Speicher für interne Per-Thread-Puffer. Irgendwann innerhalb von mkl_sparse_s_export_csr_data_i4_avx versucht es zuzuordnen (omp_get_max_threads() + 1) * num_rows * 4 Bytes; die Zahl passt nicht in 32-Bit-Ganzzahl mit Vorzeichen. Der nachfolgende Aufruf von mkl_serv_malloc führt zu Speicherbeschädigung und schließlich zu segfault. Eine mögliche Lösung besteht darin, die Anzahl der OpenMP-Threads über den Aufruf omp_set_num_threads zu ändern.

Antwort

0

Können Sie Ihr Beispiel für die letzte Version von MKL überprüfen? Ich habe es auf MKL 11.3.2 ausgeführt und es wurde korrekt für 100M-Matrix übergeben. Es kann jedoch von der Anzahl der Threads auf Ihrem Computer abhängen (Matrixgröße muss mehrere Threads kleiner als max int sein). Um solche Probleme zu vermeiden, wird dringend empfohlen, die ilp64-Version der MKL-Bibliotheken zu verwenden. Danke, Alex