Saya mencari perpustakaan grafik dinamis paralel di C ++

11

Halo komunitas scicomp,

Saya telah bekerja di bidang algoritma grafik menggunakan kerangka kerja seperti NetworkX (Python), JUNG dan YFiles (Java). Saya sekarang memasuki bidang komputasi kinerja paralel dan tinggi. Untuk proyek baru, saya mencari perpustakaan grafik C ++ dengan fitur-fitur berikut:

  • memiliki antarmuka intuitif yang memungkinkan pengembangan algoritma
  • mendukung operasi dinamis: mis. penyisipan / penghapusan node / tepi sewenang-wenang
  • mendukung paralelisasi: misalnya melindungi programmer dari masalah yang timbul dengan multithreading
  • memiliki overhead memori yang rendah dan cocok untuk komputasi kinerja tinggi

Silakan sarankan beberapa perpustakaan dan diskusikan kriteria ini serta pro dan kontra.

clstaudt
sumber

Jawaban:

11

Tingkatkan Grafik Perpustakaan dan LEMON

Seperti yang disebutkan Daniel dalam jawaban komprehensifnya , perpustakaan C ++ umum berfitur lengkap adalah Boost Graph Library . Ada ekstensi memori terdistribusi baru yang mampu melakukan beberapa algoritma dasar seperti pencarian luas-pertama dan kedalaman-pertama, minimum spanning tree, dan pencarian komponen yang terhubung, tetapi saya tidak terlalu akrab dengan proyek baru. Boost Graph Library sendiri terkenal dan digunakan di banyak proyek di seluruh dunia.

Jika Anda melakukan pekerjaan grafik HPC dasar, Anda mungkin ingin memulai dengan Perpustakaan Grafik Peningkatan, tetapi perlu diketahui bahwa banyak kompiler HPC C ++ mengalami kesulitan dengan Peningkatan (meskipun kepatuhannya cukup ketat pada standar C ++), dan Anda mungkin perlu menggunakan versi lama Boost atau kompiler non-vendor seperti GCC untuk membuatnya bekerja pada sistem HPC.

Penelusuran cepat repositori LEMON menunjukkan bahwa ada keterlibatan dari tim superkomputer IBM BlueGene, tetapi saya tidak melihat dependensi atau konfigurasi untuk MPI, jadi ini kemungkinan hanya menjadi perpustakaan grafik seri saat ini.

Load-balancing dan Dynamic graph (re) -partitioning

Jika Anda tertarik pada penyeimbangan muatan dan partisi grafik dinamis, Anda memiliki beberapa opsi lagi. Mungkin perpustakaan yang paling terkenal adalah ParMETIS , yang diperbarui ke versi 4 tahun lalu. ParMETIS memiliki fitur pembobotan berbasis simpul, yang penting untuk simulasi multi-fisika.

Pesaing Eropa ParMETIS adalah PT-Scotch , yang memiliki kinerja lebih baik untuk jenis masalah tertentu, tetapi, mirip dengan ParMETIS, tidak sering diperbarui.

Anda juga mungkin tertarik pada Zoltan , yang merupakan bagian dari paket meta-paket Trilinos National Laboratories Sandia untuk komputasi ilmiah dalam C ++. Zoltan menampilkan partisi dan antarmuka hierarkisnya sendiri ke ParMETIS dan PT-Scotch.

Grafik500

Jika Anda sedang mengerjakan tepi pendarahan pencarian serentak, optimisasi (jalur sumber tunggal terpendek), dan berorientasi tepi (set independen maksimal), Anda juga akan tertarik pada benchmark Graph500 yang tersedia secara bebas .

Aron Ahmadia
sumber
1
Pertanyaan: Parallel Boost Graph Library dimaksudkan untuk paralelisme memori terdistribusi. Apakah Perpustakaan Grafik Peningkatan biasa cocok untuk paralelisasi memori bersama dengan OpenMP?
clstaudt
@clstaudt - Ini akan menjadi masalah khusus. Anda harus masuk lebih dalam ke detail algoritma Anda untuk jawaban yang lebih baik (dan itu mungkin akan menjadi pertanyaan baru).
Aron Ahmadia
5

Mungkin, Perpustakaan Grafik Peningkatan adalah apa yang Anda cari. Ini memiliki parser untuk membaca grafik yang ditentukan dalam format DOT GraphViz. Meskipun saya tidak benar-benar tahu tentang overhead memori, itu memang memberikan varian untuk paralelisasi .

Pustaka grafik lain adalah LEMON tetapi saya tidak benar-benar mengetahuinya dan jika memiliki dukungan untuk paralelisasi, itu tidak diiklankan. Situs webnya membuat kesan yang bagus;)

Daniel Eberts
sumber
LEMON juga terlihat bagus bagi saya, tetapi saya sama sekali tidak tahu apakah saya dapat menggunakannya untuk kode paralel memori bersama (OpenMP).
clstaudt
Aku juga tidak jujur. Tapi mungkin Anda bisa menggunakannya untuk mendeklarasikan struktur data bersama untuk masalah Anda dan menjalankan algoritme di utas yang berbeda. Mungkin Anda dapat membagi masalah Anda menjadi submasalah yang sesuai.
Daniel Eberts
5

Saya juga ingin menyebutkan STINGER , struktur data grafik dinamis yang dirancang untuk paralelisme. Menurut situs web, ini dirancang untuk tujuan berikut:

Portabilitas: Algoritma yang ditulis untuk STINGER dapat dengan mudah diterjemahkan / dipindahkan antara berbagai bahasa dan kerangka kerja

Produktivitas: STINGER harus menyediakan struktur data abstrak yang umum sehingga komunitas grafik besar dapat dengan cepat memanfaatkan perkembangan penelitian satu sama lain. Ini mirip dalam filosofi dengan komunitas algoritma numerik penggunaan implisit matriks jarang dan padat.

Kinerja: Diakui bahwa tidak ada struktur data tunggal yang optimal untuk setiap algoritma grafik. Tujuan dari STINGER adalah untuk mengkonfigurasi struktur data yang masuk akal yang dapat menjalankan sebagian besar algoritma dengan baik. Seharusnya tidak ada pengurangan kinerja yang signifikan untuk menggunakan STINGER bila dibandingkan dengan struktur data umum lainnya di seluruh rangkaian algoritma grafik yang khas. STINGER harus mengasumsikan ruang alamat memori bersama, dan memungkinkan algoritma sekuensial atau paralel. Struktur data harus memungkinkan algoritma paralel untuk mengeksploitasi konkurensi jika memungkinkan.

Ini tidak generik seperti LEMON atau Boost Graph Library dan pada tahap awal pengembangan. Jika Anda memeriksanya, saya akan tertarik dengan komentar Anda.

clstaudt
sumber
STINGER Keluar dari lab David Bader di Georgia Tech. Dia terkenal di komunitas HPC untuk karyanya di Graph500, terima kasih telah menyebutkan yang ini!
Aron Ahmadia