Çok çekirdekli işlemcilerde iş parçacığı ayırma nasıl programlanır?


13

Örneğin, iki farklı işlemci çekirdeği tarafından yürütülen iki farklı iş parçacığı kullanan bir program oluşturmak için çok çekirdekli bir işlemcideki iş parçacıklarıyla denemeler yapmak istiyorum.

Ancak, iş parçacıklarının farklı çekirdeklere hangi düzeyde tahsis edildiği net değil. Aşağıdaki senaryoları hayal edebilirim (işletim sistemine ve programlama dili uygulamasına bağlı olarak):

  1. İş parçacığı ayırma, işletim sistemi tarafından yönetilir. İş parçacıkları işletim sistemi sistem çağrıları kullanılarak oluşturulur ve işlem çok çekirdekli bir işlemcide çalışırsa, işletim sistemi otomatik olarak farklı çekirdeklerde farklı iş parçacıkları ayırmaya / zamanlamaya çalışır.
  2. İş parçacığı tahsisi programlama dili uygulaması tarafından yönetilir. İş parçacıklarını farklı çekirdeklere ayırmak özel sistem çağrıları gerektirir, ancak o dil için standart iş parçacığı uygulamasını kullandığımda programlama dili standart iş parçacığı kitaplıkları bunu otomatik olarak işler.
  3. İş parçacığı tahsisi açıkça programlanmalıdır. Programımda, kaç tane çekirdeğin bulunduğunu tespit etmek ve örneğin kütüphane işlevlerini kullanarak farklı çekirdeklere farklı iş parçacıkları tahsis etmek için açık kod yazmak zorundayım.

Soruyu daha spesifik hale getirmek için, çok iş parçacıklı uygulamamı Windows veya Linux'ta Java veya C ++ ile yazdığımı hayal edin. Uygulamam çok çekirdekli bir işlemci üzerinde çalışırken sihirli bir şekilde birden fazla çekirdek görecek ve kullanacak mı (çünkü her şey işletim sistemi veya standart iş parçacığı kütüphanesi tarafından yönetildiği için) veya birden fazla çekirdeğin farkında olmak için kodumu değiştirmem gerekiyor mu? ?

Yanıtlar:


11

Uygulamam çok çekirdekli bir işlemci üzerinde çalışırken sihirli bir şekilde birden fazla çekirdek görecek ve kullanacak mı (çünkü her şey işletim sistemi veya standart iş parçacığı kütüphanesi tarafından yönetildiği için) veya birden fazla çekirdeğin farkında olmak için kodumu değiştirmem gerekiyor mu? ?

Basit cevap: Evet, genellikle işletim sistemi veya iş parçacığı kütüphanesi tarafından yönetilir.

İşletim sistemindeki iş parçacığı alt sistemi, işlemcilere öncelikli olarak iş parçacıkları atayacaktır (seçenek 1). Başka bir deyişle, bir iş parçacığı zaman ayırması veya blokları için yürütmeyi tamamladığında, zamanlayıcı bir sonraki en yüksek öncelikli iş parçacığını arar ve bunu CPU'ya atar. Ayrıntılar işletim sisteminden işletim sistemine değişir.

Bununla birlikte, seçenekler 2 (programlama dili tarafından yönetilir) ve 3 (açıkça) mevcuttur. Örneğin, .net'in son sürümlerinde Tasks kütüphanesi ve async / await, geliştiriciye paralelleştirilebilir (yani kendisiyle eşzamanlı olarak çalışabilen) kod yazmak için çok daha kolay bir yol sağlar. Fonksiyonel programlama dilleri doğal olarak paralelleştirilebilir ve bazı çalışma zamanları mümkünse programın farklı bölümlerini paralel olarak çalıştırır.

Seçenek 3'e gelince (Windows), iş parçacığı benzeşimini ayarlamanıza izin verir (bir iş parçacığının hangi işlemcilerin üzerinde çalışabileceğini belirterek). Bununla birlikte, bu en hızlı, tepki süresi kritik sistemlerin dışında genellikle gereksizdir. İşlemci tahsisine etkili iş parçacığı, donanıma çok bağlıdır ve aynı anda çalışan diğer uygulamalara karşı çok duyarlıdır.

Denemek istiyorsanız, asal sayıların bir listesini oluşturmak veya bir Mandelbrot kümesi oluşturmak gibi uzun süre çalışan, CPU yoğun bir görev oluşturun. Şimdi en sevdiğiniz kitaplıkta iki iş parçacığı oluşturun ve her iki iş parçacığını çok işlemcili bir makinede çalıştırın (başka bir deyişle, son birkaç yıl içinde yayımlanan hemen hemen her şey). Her iki görev de aynı anda tamamlanmalıdır çünkü paralel olarak çalışırlar.


Açıklama için teşekkürler (+1). Test programım bir birleştirme sıralama uygulamasıdır. Bölünmüş aşamada, çekirdekler olduğu sürece farklı iş parçacıkları oluşturmak istiyorum. Örneğin, iki çekirdekli bir dizinin her bir yarısı farklı bir iş parçacığı / çekirdek tarafından sıralanır. Birleştirme sırasında gereksiz iplikler birleştirilir / sonlandırılır.
Giorgio

Veriler rasgele dağıtılırsa, sıralama bu şekilde paralel hale getirmek zordur. Evet, parçalayabilir ve her bölümü farklı bir iş parçacığında sıralayabilirsiniz, ancak sonunda tüm bölümleri bir araya getirmeniz gerekir. İş parçacıkları veri yapılarını paylaşıyorsa, çekişme veya kilitleme sorunları da alabilirsiniz. Sıralamanın iş parçacığından faydalanamayacağını söylemiyorum ama doğrusal bir performans artışı olmayacak.
akton

Hiçbir veri paylaşılmadığından bir dizinin iki yarısı bağımsız olarak sıralanabilir. Yalnızca ilk bölme ve son birleştirme, verileri içeren tüm diziyi veya listeyi işleyen bir iş parçacığı tarafından gerçekleştirilmelidir. Bu, verilerin tam bir taramasının paralel olarak yürütülemeyeceği anlamına gelir; kalan tüm taramalar.
Giorgio

Elbette, örneklerinizi iyi adaylar olarak da görüyorum. Şu anda birleştirme türüne daha fazla aşinayım (ve bunun paralel olmayan bir sürümünü uyguladım), bu da birleştirme türünü ilk denemem olarak benim için daha uygun hale getirebilir (belki).
Giorgio

2
Bu cevaba, iyi işletim sistemlerinin, bir göreve kısa süreli açlıktan farklı bir CPU veya çekirdek üzerinde bir zaman dilimi vermenin maliyetini dengeleyecek kadar akıllı olduğunu ekleyebilirim. Önemli olduğu mimarilerde sonuç, otomajik yakınlığa benzeme eğilimindedir. İşletim sistemi, tüm işleri olabildiğince çabuk yürütmek için oluşturulmuştur ve çekirdeklere ipler bağlayarak ve bu kararları alma yeteneğini hamura ederek kendinizi ayağa vuruyor olabilirsiniz.
Blrfl

-1

Bir zamanlar kocaman bir SGI IRIX ortamım vardı. Sadece bunun için, küçük bir çok iş parçacıklı java programı yazdım (ki sadece CPU döngülerini tüketmekten başka bir şey yapmadı) ve içinde 12 iş parçacığı oluşturdum. İş, NUMA mimarisinde 12 CPU'ya yayılmıştır. Belki programa bakıp Dell R910'larda çalıştıracağım ve kontrol edeceğim.


3
Bu cevap gerçekten mevcut cevaba pek bir şey katmıyor. Belki de SGI sistemindeki JVM'nin neden ipleri çekirdeğe ayırdığını açıkladıysanız ...
Jay Elston
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.