Fdtd3d: Pertanyaan dalam komputasi paralel

Dibuat pada 8 Jan 2020  ·  9Komentar  ·  Sumber: zer011b/fdtd3d

Hai Gleb,

Saya Chengyi. Terima kasih telah mengembangkan proyek yang luar biasa ini. Sangat membantu untuk mempelajari FDTD dan konkurensinya. Tetapi saya mengalami beberapa masalah dalam menggunakan komputasi MPI/GPU.

  1. Masalahnya adalah ketika saya memanggil kode fdtd3d menggunakan perintah berikut,
    ./Release/Source/fdtd3d --cmd-from-file ./Examples/vacuum3D_test.txt
    di mana saya membuat "vacuum3D_test.txt" berdasarkan "vacuum3D.txt" dengan memasukkan kode berikut
--use-cuda
--cuda-buffer-size 1
--cuda-gpus 0
--num-cuda-threads-x 4
--num-cuda-threads-y 4
--num-cuda-threads-z 4

program hanya akan menampilkan log "Memuat baris perintah dari file ./Examples/vacuum3D_test.txt
" dan terus menunggu sampai saya mematikannya. Saya hanya ingin tahu apakah ada beberapa konfigurasi yang tidak saya atur dengan benar?
Omong-omong, ini adalah flag cmake saya jika Anda membutuhkannya:
cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -DVALUE_TYPE=f -DPRINT_MESSAGE=ON -DCUDA_ENABLED=ON -DCUDA_ARCH_SM_TYPE=sm_60 -DCXX11_ENABLED=ON -DPARALLEL_GRID=ON -DPARALLEL_GRID_DIMENSION=3

  1. Juga, ketika saya mensimulasikan "vacuum3D.txt" oleh MPI, skalabilitas yang disajikan oleh fdtd3d tidak terlalu ideal. Misalnya, ukuran kisi adalah 40 kali 40 kali 40 yang sama dengan 64000. Dan saya memiliki satu chip yang memiliki 18 inti. Ketika berjalan dengan 1 proses, biayanya 67,74 detik dan sekitar 11,34 detik dengan 8 prosesor diaktifkan. Kecepatannya sekitar 6. Dan ketika saya menerapkan lebih banyak prosesor seperti 18, pengurangan waktu itu sepele, katakanlah dari 11,34 detik menjadi 9,6 detik. Apakah ini masuk akal? Dapatkah saya bertanya apakah sudah ada konfigurasi simulasi yang dapat menyempurnakan kinerja komputasi paralel?

Jika Anda membutuhkan lebih banyak detail simulasi, beri tahu saya. Terima kasih banyak.

Dengan banyak terima kasih dan harapan,
Chengyi

Question

Semua 9 komentar

  1. Saya tidak berpikir itu macet, itu hanya melakukan perhitungan, yang jauh lebih lambat bahkan dalam mode RelWithDebInfo . Selain itu, log lengkap dicetak di akhir pelaksanaan jika Cuda diluncurkan.

Tip kecil: lebih cepat (dalam hal kompilasi dan eksekusi) untuk menentukan -DSOLVER_DIM_MODES , jika Anda tahu persis mode mana yang akan Anda gunakan. Secara default semua mode dikompilasi ke dalam biner, yang secara signifikan meningkatkan waktu kompilasi dalam kasus Cuda build. Dalam kasus Anda -DSOLVER_DIM_MODES=DIM3 sudah cukup.

  1. Ada beberapa hal yang perlu diingat di sini. Pertama-tama, waktu eksekusi keseluruhan dari setiap langkah waktu adalah jumlah waktu komputasi dan waktu berbagi. Ketika grid relatif kecil, seperti dalam kasus Anda, waktu berbagi bisa menjadi signifikan dan pilihan yang cermat dari topologi virtual diperlukan (fdtd3d menunjukkan topologi virtual terbaik untuk ukuran grid yang ditentukan dalam outputnya).

Namun, pada sistem dengan operasi berbagi memori bersama tidak diperlukan sama sekali (kecuali untuk sinkronisasi utas). Itulah mengapa OpenMP jauh lebih dapat diterapkan di sini daripada MPI, dan program berbasis MPI tidak akan menunjukkan kecepatan terbaik. Sayangnya, OpenMP belum didukung di fdtd3d.

Dengan semua ini dalam pikiran, masih ada hal-hal untuk tweak di fdtd3d.

  • Secara default hanya sumbu Ox yang tersebar di antara node komputasi, tetapi Anda dapat mengubahnya dengan -DPARALLEL_BUFFER_DIMENSION=xyz , yang akan membagi kisi di antara potongan di semua dimensi. Periksa keluaran fdtd3d karena menyarankan topologi virtual yang optimal.
  • Ukuran buffer dapat diatur dengan --buffer-size B , dan operasi berbagi hanya akan dilakukan setiap B langkah. Dalam hal ini topologi virtual yang optimal, yang disarankan oleh fdtd3d, tidak dijamin akan optimal. Tetapi Anda dapat mengatur topologi virtual secara manual dengan --manual-topology --topology-sizex X --topology-sizey Y --topology-sizez Z .

Perhatikan bahwa ketika jumlah proses bukan merupakan pembagi dari ukuran keseluruhan grid, topologi virtual yang optimal, disarankan oleh fdtd3d, juga tidak dijamin optimal.

Terima kasih atas balasan yang tepat waktu ini.

  1. Adapun komputasi GPU tunggal, saya membuat ulang fdtd3d dengan flag berikut:

cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -DVALUE_TYPE=f -DPRINT_MESSAGE=ON -DCUDA_ENABLED=ON -DCXX11_ENABLED=ON -DPARALLEL_GRID=ON -DPARALLEL_GRID_DIMENSION=3 -DSOLVER_DIM_MODES=DIM3 -DPARALLEL_BUFFER_DIMENSION=x

dan itu berhasil di workstation saya. (BTW, workstation saya memiliki empat Tesla P100 yang lengkungannya harus SM_60)

  1. Ketika saya ingin mengaktifkan komputasi multi-gpu dengan
    mpiexec --mca btl ^openib -n 2 ./Release/Source/fdtd3d --cmd-from-file ./Examples/vacuum3D_test.txt
    dan cmd CUDA
--use-cuda
--cuda-buffer-size 2
--buffer-size 2
--cuda-gpus 0,1
--num-cuda-threads-x 4
--num-cuda-threads-y 4
--num-cuda-threads-z 4

terjadi kesalahan seperti yang ditunjukkan:

Calculating time step 0...
Calculating time step 1...
Fatal error: an illegal memory access was encountered at /home/t00540502/fdtd3d/Source/Scheme/InternalScheme.inc.h:912
*** FAILED - ABORTING
-------------------------------------------------------
Primary job  terminated normally, but 1 process returned
a non-zero exit code.. Per user-direction, the job has been aborted.

Tampaknya langkah pertama baik-baik saja tetapi ada yang salah dengan fungsi panggilan InternalSchemeKernelHelpers::calculateFieldStepIterationKernel pada langkah ke-2. Saya bertanya-tanya pasti ada beberapa kesalahan yang saya buat dalam menggunakan MPI+CUDA. Bisakah Anda mengajari saya cara memanggilnya dengan benar?
Terima kasih banyak.

Terbaik

Mungkin ada yang salah dengan sm_60 arch, saya belum mengujinya. Lengkungan default adalah sm_20, jadi itu akan berfungsi pada kartu Anda. Namun, terkadang saya melihat illegal memory access ketika cuda arch tidak sesuai dengan kemampuan komputasi GPU.

Komputasi multi-gpu memiliki penerapan yang terbatas. Jika semua data muat dalam memori satu GPU, maka akan jauh lebih cepat untuk melakukan komputasi pada satu GPU ini pada satu node komputasi (karena tidak akan ada pembagian data perantara antara CPU/GPU dan antara node komputasi yang berbeda).

Tetapi ketika grid sangat besar dan tidak dapat ditempatkan dalam memori satu node komputasi, tidak ada pilihan selain menggunakan beberapa node komputasi, masing-masing mungkin memiliki GPU. Dalam hal ini CPU-GPU dan berbagi data CPU-CPU akan dilakukan setiap B langkah, secara default B=1 . Ini jauh lebih lambat daripada komputasi biasa dari semua langkah waktu pada satu GPU.

Komputasi multi-gpu belum sepenuhnya didukung di fdtd3d, karena saat ini fdtd3d bergantung pada pengguna untuk memastikan bahwa semua data sesuai dengan tempatnya (juga dalam mode hanya CPU). Jadi, dengan keterbatasan seperti itu seharusnya berhasil.

@solotcy Ada bug dengan lengkungan yang tidak disetel (lihat #140). Tolong, periksa dengan sm_60 pada PR itu.

Illegal memory access terkait dengan akses ke variabel global cudaSolverSettings, yang terletak di memori perangkat (lihat INTERNAL_SCHEME_BASE<Type, TCoord, layout_type>::calculateFieldStepIteration ):

if (SOLVER_SETTINGS.getDoUseTFSF ())

Pada 2 dari 3 GPU dengan kemampuan komputasi yang sama sm_35, di mana saya telah menguji fdtd3d, semuanya bekerja dengan baik (semua GPU adalah model yang berbeda). Namun, pada satu untuk beberapa alasan cudaSolverSettings menjadi NULL, ketika memasukkan metode getDoUseTFSF (yaitu ptr ini adalah NULL). Saya belum dapat memahami mengapa ini terjadi, tetapi dari apa yang saya temukan ini mungkin terjadi karena kerusakan perangkat.

Sepertinya Anda berhasil meluncurkan fdtd3d setidaknya di salah satu dari 4 GPU Anda. Coba mode khusus GPU pada setiap GPU secara terpisah. Karena semua 4 GPU Anda persis sama, seharusnya tidak ada perbedaan sama sekali dalam perilaku fdtd3d. Jika ada perbedaan, maka penyebab kerusakan perangkat menjadi lebih mungkin.

Terima kasih banyak atas balasannya.

Saya telah memeriksa PR #140 dan membangun kembali fdtd3d dengan flag -DCUDA_ARCH_SM_TYPE=sm_60 ditambahkan. Sayangnya, masalah yang sama terjadi.

Namun, seperti yang Anda sebutkan, saya mengalami kesalahan yang sama ketika saya beralih di antara GPU yang berbeda pada mode GPU tunggal. Dan itu bukan di langkah pertama tapi yang kedua, seperti sebelumnya,

Estimated current size: 1437644553 byte.
Setup blocks:
blockCount:
Coord (X : 1.000000, Y : 1.000000, Z : 1.000000).
blockSize:
Coord (X : 200.000000, Y : 200.000000, Z : 200.000000).
Calculating time step 0...
Calculating time step 1...
Fatal error: an illegal memory access was encountered at ~/fdtd3d/Source/Scheme/InternalScheme.inc.h:912

Dan hal-hal menjadi agak aneh karena hanya bekerja pada GPU pertama. Untuk tiga lainnya, semuanya gagal dan memiliki info kesalahan yang sama.

Terima kasih untuk tes Anda! Saya akhirnya bisa mengetahui alasan inti dari masalah ini. PR #141 memecahkan masalah. Sekarang fdtd3d harus bekerja pada semua GPU Anda. Mode multi-gpu tampaknya berfungsi juga sekarang.

Terima kasih atas balasan Anda dan kode yang dimodifikasi. Saya dapat menjalankan program di workstation saya dengan GPU sebanyak yang saya inginkan. Kemudian saya dapat menguji skalabilitas pada CPU dan GPU.
Ini cukup keren, terima kasih!!!

Jangan ragu untuk membuka kembali masalah ini jika ada pertanyaan lebih lanjut.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

franciscolourenco picture franciscolourenco  ·  15Komentar

GreYFoX picture GreYFoX  ·  24Komentar

slothbag picture slothbag  ·  108Komentar

rburchell picture rburchell  ·  11Komentar

dictoon picture dictoon  ·  10Komentar