Saya telah mencoba untuk memparalelkan skrip berikut, khususnya masing-masing dari tiga instance loop FOR, menggunakan GNU Parallel tetapi belum mampu. 4 perintah yang terkandung dalam loop FOR dijalankan secara seri, masing-masing loop membutuhkan waktu sekitar 10 menit.
#!/bin/bash
kar='KAR5'
runList='run2 run3 run4'
mkdir normFunc
for run in $runList
do
fsl5.0-flirt -in $kar"deformed.nii.gz" -ref normtemp.nii.gz -omat $run".norm1.mat" -bins 256 -cost corratio -searchrx -90 90 -searchry -90 90 -searchrz -90 90 -dof 12
fsl5.0-flirt -in $run".poststats.nii.gz" -ref $kar"deformed.nii.gz" -omat $run".norm2.mat" -bins 256 -cost corratio -searchrx -90 90 -searchry -90 90 -searchrz -90 90 -dof 12
fsl5.0-convert_xfm -concat $run".norm1.mat" -omat $run".norm.mat" $run".norm2.mat"
fsl5.0-flirt -in $run".poststats.nii.gz" -ref normtemp.nii.gz -out $PWD/normFunc/$run".norm.nii.gz" -applyxfm -init $run".norm.mat" -interp trilinear
rm -f *.mat
done
shell-script
gnu-parallel
Ravnoor S Gill
sumber
sumber
wait
perintah di akhir sehingga skrip master tidak keluar sampai semua pekerjaan latar belakang selesai.nice
, tetapi kemudian saya tidak tahu apakah itu akan pernah selesai ..Tugas sampel
Berjalan berurutan
Berjalan paralel
Paralel berjalan dalam batch proses-N
Juga dimungkinkan untuk menggunakan FIFO sebagai semafor dan menggunakannya untuk memastikan bahwa proses baru muncul sesegera mungkin dan bahwa tidak lebih dari proses N berjalan pada saat yang sama. Tetapi membutuhkan lebih banyak kode.
N memproses dengan semafor berbasis FIFO:
sumber
wait
di dalamnya pada dasarnya memungkinkan semua proses berjalan, sampai menyentuhnth
proses, lalu menunggu semua yang lain selesai berjalan, apakah itu benar?i
nol, panggilan tunggu. Peningkatani
setelah tes nol.wait
tanpa arg menunggu semua anak. Itu membuatnya sedikit boros. Pendekatan semaphore berbasis-pipa memberi Anda konkurensi yang lebih lancar (Saya telah menggunakannya dalam sistem pembangunan berbasis cangkang khusus bersama dengan-nt
/-ot
berhasil memeriksa untuk sementara waktu sekarang)mkfifo pipe-$$
perintah perlu akses tulis yang sesuai ke direktori saat ini. Jadi saya lebih suka menentukan path lengkap seperti/tmp/pipe-$$
itu karena kemungkinan besar memiliki akses tulis yang tersedia untuk pengguna saat ini daripada mengandalkan apa pun direktori saat ini. Ya ganti semua 3 kejadian daripipe-$$
.Apakah itu benar-benar berfungsi tergantung pada perintah Anda; Saya tidak terbiasa dengan mereka. The
rm *.mat
terlihat sedikit rawan konflik jika berjalan secara paralel ...sumber
rm *.mat
sesuatu sepertirm $run".mat"
membuatnya bekerja tanpa satu proses mengganggu yang lain. Terima kasih .wait
, yang saya lupa.Ini akan menggunakan semaphores, sejajar dengan iterasi sebanyak jumlah core yang tersedia (-j +0 berarti Anda akan memparalelkan pekerjaan N + 0 , di mana N adalah jumlah core yang tersedia ).
sem --wait memberitahu untuk menunggu sampai semua iterasi dalam for loop telah menghentikan eksekusi sebelum mengeksekusi baris kode yang berurutan.
Catatan: Anda membutuhkan "paralel" dari proyek paralel GNU (sudo apt-get install parallel).
sumber
Salah satu cara mudah yang sering saya gunakan:
Ini akan menjalankan perintah, melewati setiap baris file "args", secara paralel, berjalan paling banyak $ NUM_PARALLEL pada saat yang sama.
Anda juga dapat melihat opsi -I untuk xargs, jika Anda perlu mengganti argumen input di tempat yang berbeda.
sumber
Tampaknya pekerjaan fsl tergantung pada satu sama lain, sehingga 4 pekerjaan tidak dapat dijalankan secara paralel. Akan tetapi, proses dapat dijalankan secara paralel.
Buat fungsi bash menjalankan menjalankan tunggal dan jalankan fungsi itu secara paralel:
Untuk mempelajari lebih lanjut tonton video intro: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1 dan menghabiskan satu jam berjalan melalui tutorial http://www.gnu.org/software/parallel/parallel_tutorial.html Perintah Anda baris akan mencintaimu karenanya.
sumber
export SHELL=/bin/bash
sebelum menjalankan paralel. Kalau tidak, Anda akan mendapatkan kesalahan seperti:Unknown command 'myfunc arg'
Eksekusi paralel dalam max N-proses bersamaan
sumber
Saya sangat menyukai jawaban dari @lev karena ia memberikan kontrol atas jumlah maksimum proses dengan cara yang sangat sederhana. Namun seperti yang dijelaskan dalam manual , sem tidak bekerja dengan tanda kurung.
Apakah pekerjaan itu.
sumber
Dalam kasus saya, saya tidak bisa menggunakan semaphore (saya di git-bash pada Windows), jadi saya menemukan cara umum untuk membagi tugas di antara para pekerja N, sebelum mereka mulai.
Ini bekerja dengan baik jika tugas-tugasnya memakan waktu yang kira-kira sama. Kerugiannya adalah, jika salah satu pekerja membutuhkan waktu lama untuk melakukan bagian pekerjaannya, yang lain yang sudah selesai tidak akan membantu.
Membagi pekerjaan di antara pekerja N (1 per inti)
sumber
Saya mengalami masalah dengan
@PSkocik
solusi. Sistem saya tidak memiliki GNU Parallel yang tersedia sebagai paket dansem
melemparkan pengecualian ketika saya membangun dan menjalankannya secara manual. Saya kemudian mencoba contoh semifor FIFO yang juga melemparkan beberapa kesalahan lain tentang komunikasi.@eyeApps
menyarankan xargs tetapi saya tidak tahu bagaimana cara membuatnya bekerja dengan use case saya yang kompleks (contoh akan diterima).Berikut adalah solusi saya untuk pekerjaan paralel yang memproses hingga
N
pekerjaan sekaligus yang dikonfigurasi oleh_jobs_set_max_parallel
:_lib_jobs.sh:
Contoh penggunaan:
sumber