Saya memiliki aplikasi yang dapat diparalelkan secara sepele tetapi kinerjanya sebagian besar terikat I / O. Aplikasi membaca larik input tunggal yang disimpan dalam file yang biasanya berukuran 2-5 GB (tapi saya berharap angka ini bertambah di masa mendatang). Perhitungan tipikal berlaku operasi yang sama untuk setiap baris atau kolom array itu. Untuk operasi CPU-berat, saya mendapatkan skala yang sangat baik hingga sekitar 100 prosesor, tetapi untuk operasi lebih lambat I / O dan komunikasi terkait (akses NFS) mendominasi dan saya tidak dapat menggunakan lebih dari beberapa prosesor secara efisien.
Apa opsi yang efisien dan portabel (idealnya efisien portable) untuk situasi seperti itu? HDF5 paralel tampaknya menjanjikan. Apakah ada yang punya pengalaman nyata dengan itu?
Apakah MPI-I / O akan menjadi sesuatu yang layak untuk dilihat? Bisakah ini bekerja secara efisien dengan tata letak file yang diberikan, atau apakah saya harus menyesuaikan semuanya?
sumber
Jawaban:
I / O paralel dapat membantu Anda dalam hal ini, tetapi jika Anda menggunakan NFS (pada dasarnya serial) untuk melayani file Anda, maka itu tidak akan memiliki efek penuh yang Anda inginkan - akan ada hambatan serial di fileserver dan memiliki ratusan proses membuat permintaan dari server tunggal tidak akan memberi Anda faktor percepatan ratusan melakukannya melalui satu proses tunggal. Namun, ini bisa membantu sampai titik tertentu, terutama karena sepertinya hambatannya adalah membaca daripada menulis, dan itu akan menjadi peningkatan besar jika sistem Anda ditingkatkan ke sistem file yang sepenuhnya paralel.
MPI-IO adalah level yang sangat rendah; ada baiknya memahami sesuatu tentang hal itu untuk mengetahui apa yang terjadi "di balik tenda" dengan paralel HDF5, NetCDF4 , atau ADIOS , tetapi menggunakannya sendiri benar-benar hanya cocok untuk data biner mentah di mana struktur tersebut dikenal pada saat kompilasi. HDF5 dan NetCDF4 jauh lebih fleksibel.
Perhatikan bahwa jika data Anda relatif sederhana - misalnya, struktur data besar terutama array atau vektor n-dimensi - saya sarankan NetCDF4 (yang juga paralel, dan berdasarkan HDF5) daripada HDF5; itu cukup nyata mudah untuk digunakan. HDF5 lebih rumit, dan sebagai gantinya kompleksitas memungkinkan model data yang sangat rumit. Tetapi jika itu fitur yang tidak Anda butuhkan, lebih cepat untuk memulai di NetCDF4.
Di pusat kami, kami memiliki kelas sore dan satu hari panjang pada I / O paralel di mana kami berbicara tentang konsep dasar, MPI-IO, HDF5, dan NetCDF4; slide dapat ditemukan di sini .
sumber
Kami mendapatkan peningkatan yang baik ke seluruh XT6 di ORNL menggunakan MPI / IO untuk vektor keluaran. Ini kodenya . Subsistem I / O untuk banyak mesin tidak dirancang untuk paralelisme masif, jadi saya pikir @Dan benar bahwa saya akan mencoba untuk meminimalkan IO dengan hanya menulis setiap beberapa langkah, atau beberapa strategi aglomerasi lainnya.
Sejauh menulis output secara fleksibel dengan cara yang dapat diskalakan, saya memiliki pengalaman dengan XDMF , yang dapat dipengaruhi oleh penulisan biner paralel besar menggunakan HDF5 (seperti PETSc VecView ) ditambah dengan sejumlah kecil kode XML yang ditulis secara serial untuk menggambarkan tata letak. Ini dapat dibaca oleh paket visualisasi seperti Paraview atau MayaVi2 . Cara lain untuk melakukan ini adalah menggunakan format VTK dengan data biner yang ditambahkan, namun ini mengharuskan Anda tahu semua yang ingin Anda tulis di muka.
sumber
Saya berasumsi masalah skalabilitas Anda terkait dengan output, dan bukan input. Input paralel agak sederhana - apa yang saya lakukan adalah setiap CPU membuka input file NetCDF dan membaca bagian array milik tile-nya (mungkin ada batasan berapa banyak pembaca yang bisa membuka file NetCDF yang sama tapi saya tidak yakin ). Output paralel lebih bermasalah.
Apa yang saya lakukan saat ini tidak cukup optimal, tetapi bekerja untuk saat ini. Saya mengumpulkan semuanya pada satu CPU dan melakukan keluaran serial. Sementara itu, pemain lain menunggu sampai penulis selesai. Ini bekerja dengan baik untuk saya karena saya berhasil menjaga perhitungan rasio keluaran cukup tinggi - jadi skalabilitas akan lebih baik untuk lebih dari 200 CPU. Tapi ini bukan solusi yang Anda cari.
Solusi lain adalah apa yang disarankan Yann - menulis serial ke file N dan memiliki CPU drone merakit ubin menjadi satu bagian - jika RAM memungkinkan.
Terlepas dari pustaka I / O paralel yang disarankan dalam jawaban sebelumnya, Anda mungkin juga ingin melihat ke Parallel NetCDF http://trac.mcs.anl.gov/projects/parallel-netcdf , karena Anda sudah terbiasa dengan NetCDF dan MPI. Saya tidak menggunakannya dalam latihan, tetapi berencana untuk pergi ke arah itu ketika saya menabrak dinding dengan mengumpulkan + serial I / O.
sumber