Aşağıdaki çok basit bilgisayar programını düşünün:
for i = 1 to n:
y[i] = x[p[i]]
Burada ve y , baytların n- elementli dizileridir ve p , n- elementli bir kelime dizisidir. Burada n büyüktür, örneğin, n = 2 31 (böylece verilerin sadece ihmal edilebilir bir kısmı herhangi bir önbellek türüne sığar).
1 ile n arasında eşit olarak dağılmış rastgele sayılardan oluştuğunu varsayın .
Modern donanım açısından, bu aşağıdakiler anlamına gelmelidir:
- okuma ucuz (ardışık okuma) olduğu
- okumak çok pahalıdır (rastgele okumalar; neredeyse tüm okumalar önbellek özledimidir; her bir baytı ana bellekten almak zorundayız)
- yazma ucuz (sıralı yazma) 'dir.
Ve bu gerçekten gözlemlediğim şey. Program sadece sıralı okuma ve yazma yapan bir programla karşılaştırıldığında çok yavaştır. Harika.
Şimdi soru geliyor: Bu program modern çok çekirdekli platformlarda ne kadar iyi paralellik gösteriyor ?
Benim hipotezim, bu programın iyi paralellik göstermediğiydi. Sonuçta, darboğaz ana hafızadır. Tek bir çekirdek zamanının çoğunu sadece ana bellekten bazı verileri beklemek için harcıyor.
Ancak, bu oldu değil ben darboğaz operasyon bu tür bazı algoritmalar denemeye başladığında ne gözlenen!
Basit for-loop'u bir OpenMP paralel for-loop ile değiştirdim (özünde, sadece aralığını daha küçük parçalara böler ve bu parçaları paralel olarak farklı CPU çekirdeklerinde çalıştırır).
Düşük seviye bilgisayarlarda, hızlanmalar gerçekten küçüktü. Ancak üst düzey platformlarda mükemmel lineer hızlanma elde ettiğime şaşırdım. Bazı somut örnekler (kesin zamanlamalar biraz kapalı olabilir, çok fazla rastgele varyasyon var; bunlar sadece hızlı deneylerdi):
2 x 4 çekirdekli Xeon (toplam 8 çekirdek): tek iş parçacıklı versiyona kıyasla faktör 5-8 hızlanma.
2 x 6 çekirdekli Xeon (toplam 12 çekirdek): tek iş parçacıklı versiyona göre faktör 8-14 hızlanma.
Şimdi bu tamamen beklenmedik bir şeydi. Sorular:
Tam olarak bu tür bir program neden bu kadar iyi paralellik gösteriyor ? Donanımda ne olur? (Şu anki tahminim bu satırlar boyunca bir şey: farklı iş parçacığından gelen rastgele okumalar "ardışık düzenlenmiş" ve bunlara ortalama yanıt alma oranı tek bir iş parçacığından çok daha yüksek.)
Öyle mi birden konuları ve çoklu çekirdek kullanmak için gerekli herhangi bir kat hızlanma elde etmek? Eğer ana bellek ve CPU arasındaki arayüzde bir çeşit boru hattı gerçekleşirse, tek iş parçacıklı bir uygulama ana belleğe yakında , x [ p [ i + 1 ] ] , ... ve bilgisayar ilgili önbellek satırlarını ana bellekten almaya başlayabilir mi? Prensipte bu mümkün ise, pratikte bunu nasıl başarabilirim?
Bu tür programları analiz etmek (ve performansın doğru tahminlerini yapmak) için kullanabileceğimiz doğru teorik model nedir ?
Düzenleme: Şimdi burada bazı kaynak kodu ve karşılaştırma sonuçları var: https://github.com/suomela/parallel-random-read
Bazı basketbol sahası örnekleri ( ):
- yak. Tek bir iş parçacığı ile yineleme başına 42 ns (rastgele okuma)
- yak. 12 çekirdek ile yineleme başına 5 ns (rastgele okuma).