Mendapatkan item paralel dalam resolusi ketergantungan

13

Saya telah menerapkan jenis topologi berdasarkan artikel Wikipedia yang saya gunakan untuk resolusi dependensi, tetapi mengembalikan daftar linier. Algoritma apa yang dapat saya gunakan untuk menemukan jalur independen?

Massa
sumber
1
Salah satu cara untuk mengatasi ini adalah dengan memodelkan node dalam grafik sebagai aktor dan membiarkan beberapa perpustakaan aktor mengurus pemesanan.
svick

Jawaban:

16

Saya berasumsi bahwa edge berarti bahwa Anda harus dieksekusi sebelum v . Jika bukan ini masalahnya, balikkan semua tepinya. Saya selanjutnya berasumsi bahwa Anda kurang tertarik pada jalur (yang sudah diberikan oleh DAG) daripada strategi eksekusi yang baik mengingat dependensi.(kamu,v)kamuv

SsayaG=(V,E)

S0={vVkamuV.(kamu,v)E}Ssaya+1={vVkamuV.(kamu,v)Ekamuk=0sayaSk}

Anda kemudian dapat menjalankan tugas-tugas Anda seperti ini (mari kita asumsikan ada k set):

for i=0 to k
  parallel foreach T in S_k
    execute T

Tentu saja, ini tidak menghasilkan throughput maksimum jika tugas mengambil jumlah waktu yang berbeda: dua paralel, rantai linear yang bebas disinkronkan setelah setiap elemen. Untuk menghindari ini, saya sarankan Anda bekerja langsung pada DAG dengan traversal paralel yang dimulai pada node sumber - yang ada diS0 - dan sinkronisasi / forking dalam node dengan beberapa tepi masuk / keluar:

parallel foreach T in S_0
  recursive_execute T

dimana

recursive_execute T {
  atomic { if T.count++ < T.indeg then return }
  execute T
  parallel foreach T' in T.succ
    recursive_execute T'
}

dan T.countmerupakan penghitung sederhana yang memiliki jumlah pendahulu Tyang telah dieksekusi, T.indegjumlah pendahulunya dan T.succperangkat penerusnya.

Raphael
sumber