Ana Sayfa

Rayon ile Paralel Grafik Algoritmaları: Farklı Yaklaşımlar

1 dk okuma

Wild linker, paralel işlem yetenekleri için Rayon kütüphanesini yoğun bir şekilde kullanmaktadır. Ancak, bazı durumlarda, özellikle iş yükünün önceden belirlenemediği grafik keşfi gibi algoritmalarda, standart par_iter gibi yaklaşımlar yetersiz kalmaktadır. Bu makale, bu tür dinamik iş yüklerine sahip grafik algoritmalarını Rayon ile paralel hale getirmek için denenen çeşitli yöntemleri ve bu süreçte elde edilen öğrenimleri detaylandırmaktadır.

İlk yaklaşımlardan biri olan "spawn broadcast" yönteminde, her bir iş parçacığı için bir görev oluşturulmuş ve iş paylaşımı ile görev kontrolü manuel olarak yönetilmiştir. Bu yöntem, iş parçacıklarının bir kanaldan iş çekmesi ve iş bulamadığında duraklaması, yeni iş geldiğinde ise uyandırılması prensibine dayanıyordu. Ancak bu yaklaşım oldukça karmaşık bulunmuş ve Rayon'un diğer özelliklerinin (örneğin par_iter) aynı anda kullanılmasını engellemiştir, çünkü diğer iş parçacıkları kendi işlerini yapıyor veya bekliyor olabilirdi.

Daha sonra "scoped spawning" yöntemi denenmiştir. Bu yaklaşım, rayon::scope veya in_place_scope kullanarak bir kapsam oluşturmayı ve bu kapsam içine başlangıç görevlerini yerleştirmeyi içerir. Görevler, daha fazla görev üretebilir ve bu süreç, yeni görev kalmayana kadar devam eder. Rayon dokümantasyonu bu yöntemin diğerlerine göre daha maliyetli olduğu konusunda uyarıda bulunur, zira görevler için yığın bellek tahsisi (heap allocation) gerektirir. Gerçekten de, bu yaklaşım kullanıldığında yığın bellek tahsislerinde artış gözlemlenmiştir. Son olarak, yığın bellek tahsislerini azaltma hedefiyle "channel + par_bridge" yaklaşımı geliştirilmiştir. Bu yöntemde, iş öğeleri bir crossbeam_channel içine yerleştirilir ve her iş öğesi, kanalın gönderici ucunun bir kopyasını tutar. Bu sayede, bir iş öğesi işlenirken kuyruğa yeni işler eklenebilir. Son iş öğesi tamamlandığında ve son gönderici kopyası bırakıldığında kanal kapanır. Bu yaklaşım, "scoped spawning" ile ilişkili yığın bellek tahsislerini başarıyla önlemektedir.

İçgörü

Rayon gibi paralel programlama kütüphaneleriyle dinamik iş yüklerine sahip grafik algoritmalarını verimli bir şekilde uygulamak için farklı stratejilerin karşılaştırılması, performans ve kaynak kullanımı açısından kritik bilgiler sunuyor.

Kaynak