Paralel işleme sıralıdan daha mı yavaş?


4

EDIT: Gelecekte bunun üzerine tökezleyen herkes için: Imagemagick bir MP kütüphanesi kullanıyor. Etraflarındalarsa kullanılabilir çekirdekleri kullanmak daha hızlıdır, ancak paralel işleriniz varsa yararsızdır.

Aşağıdakilerden birini yapın:

  • işlerinizi seri olarak yapın (Imagemagick ile paralel modda)
  • Söz konusu imagemagick ikilisini çağırmanız için MAGICK_THREAD_LIMIT = 1 değerini ayarlayın.

Imagemagick'in yalnızca bir iş parçacığı kullanmasını sağlayarak, test durumlarımda% 20-30 oranında yavaşlıyor, ancak performansta önemli bir net artış için çekirdek başına bir iş yürütebileceğim anlamına geliyordu.

Orijinal soru:

ImageMagick kullanarak bazı görüntüleri dönüştürürken biraz garip bir etki fark ettim. Xargs kullanmak döngü için bir standarttan önemli ölçüde daha yavaştı. Tek bir işlemle sınırlı olan xargs bir for döngüsü gibi davranması gerektiğinden, bunu test ettim ve yaklaşık olarak aynı buldum.

Dolayısıyla bu gösterimiz var.

  • Dört çekirdekli (AMD Athalon X4, 2.6GHz)
  • Tamamen bir ibadet üzerinde çalışmak (toplam 16g ram; takas yok)
  • Başka büyük yük yok

Sonuçlar:

/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 1 convert -auto-level

real        0m3.784s
user        0m2.240s
sys         0m0.230s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 2 convert -auto-level

real        0m9.097s
user        0m28.020s
sys         0m0.910s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 10 convert -auto-level

real        0m9.844s
user        0m33.200s
sys         0m1.270s

Bu programın iki örneğini çalıştırmanın, aynı görevi tamamlamak için gerçek zamanlı olarak iki kattan fazla, işlemci zamanında da on kattan uzun sürmesinin bir nedeni olabilir mi? Bu ilk vuruştan sonra, daha fazla işlemin bir etkisinin önemli olduğu görünmüyor.

Disk aramayla ilgili olabileceğini düşündüm, bu yüzden o testi tamamen koç olarak yaptım. Convert'ın nasıl çalıştığıyla ilgili bir şey olabilir mi ve aynı anda birden fazla kopyaya sahip olmak, işlemci önbelleğini verimli bir şekilde kullanamayacağı anlamına mı geliyor?

EDIT: 1000x 769KB dosya ile yapıldığında, performans beklendiği gibi. İlginç.

/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 1 convert -auto-level

real    3m37.679s
user    5m6.980s
sys 0m6.340s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 1 convert -auto-level

real    3m37.152s
user    5m6.140s
sys 0m6.530s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 2 convert -auto-level

real    2m7.578s
user    5m35.410s
sys     0m6.050s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 4 convert -auto-level

real    1m36.959s
user    5m48.900s
sys     0m6.350s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 10 convert -auto-level

real    1m36.392s
user    5m54.840s
sys     0m5.650s

Paralel işleme hakkında hatırlanması gereken bir diğer şey ise, konuların yönetilmesi ve programın kilitlenmeden çalışması vb.
İle

imagemagick.org/discourse-server/viewtopic.php?f=1&t=14307 , bunun imagemagick’in SMP koduyla ilgili bir sorun olduğunu gösteriyor.
zebediah49

Yanıtlar:


4

L1 önbelleğinizle karşılaştırıldığında dönüştürmek istediğiniz dosyalar ne kadar büyük? L2 önbellek mi?

İçine daha iyi bakmadan önbellek çekişmelerinin CPU'ların boşa çıkmasına neden olurken, verilerin yeniden önbelleğe alınmasını beklerken diğer işlem (ler) önemli şeyleri hızlı bellekten atmaya devam ettiğinden şüpheleniyorum.

Ayrıca Yığın Taşması ile ilgili verdiğim cevaba da bakınız .


Athlon II X4 işlemcileri, her bir çekirdeğe ayrılmış ve L3'ü olmayan 512K L2 önbelleğe sahiptir, bu nedenle basit bir önbellek çekişme sorunu değildir. Kodun bir kısmında bellek veriyolunda çakışmalara, yetersiz kilitlemeye veya gereksiz önbellek hattı geçersizliğine neden olan bazı hatalar olduğundan şüpheleniyorum. Bunun yerine ImageMagick'in çok iş parçacıklı bir versiyonunu kullanmak daha iyi olabilir. Aslında, sahip olduğunuz sürüm zaten çok iş parçacıklı olmalıdır, bu nedenle gecikme aslında birbiriyle rekabet eden iş parçacıklarından kaynaklanıyor olabilir.
billc.cn

dmidecode, 512K L3'üm olduğunu, L2'nin ve 128K'lık L1'in olduğunu ancak yeterince yakın olduğumu söylüyor (ayrıca, demidecode'un yalan olduğu biliniyor). Söz konusu görüntüler, ilişkili olabilecek 3.1KB (54 + 32 * 32 * 3 bayt) değerindedir. Dönüştürme-dönüştürme raporları Özellikler: OpenMP. 769K imge kümesiyle yeniden deneyeceğim.
zebediah49

:: sigh :: Çekirdek başına önbellekler bu fikri öldürüyor.
dmckee

Muhtemelen hayır, ImageMagick her bir kopyanın başına 4 iplik üretiyorsa - bu her çekirdeğin birbirinin yoluna girebileceği anlamına gelir ... Beklediğim gibi çalışan daha büyük resimler içeren bir örnek ekledim.
zebediah49
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.