Birden çok çekirdek kullanmak , genellikle programlayıcının çok iş parçacıklı bir program yazmasını gerektiren iş parçacığı düzeyinde paralelliğin açıkça gösterilmesini gerektirir. (Ya ile derleme gibi farklı girdilerin tek parçacıklı programı birden çok kez çalıştırmak için make -j4
)
Yine de bazı diller için derleyiciler otomatik paralelleştirmeyi destekler. Örneğin, OpenMP'li C veya C ++, sıradan bir for()
döngüyü birden çok iş parçacığı başlatan bir programa derleyebilir .
#pragma omp parallel for
for(int i = 0; i < 1000000; ++i)
{
A[i] = B[i] * constant + C[i];
}
Ama yine de, bu programı yazarken veya derlerken gerçekleşmelidir. Mevcut donanım ve işletim sistemlerinin tek iş parçacıklı bir programı hızlandırmak için birden fazla çekirdek kullanmasının bir yolu yoktur.
İlgili: Tek bir iş parçacığı birden çok çekirdek üzerinde nasıl çalışır? : cevap: bilmiyorlar. Ancak, tek bir CPU çekirdeğinin bir kerede bir komuttan daha hızlı çalıştırmak için bulduğu ve kullandığı Talimat düzeyinde paralellik gibi başka paralellik türleri de vardır .
Bu soruya cevabım, modern CPU'ların ince taneli talimat düzeyinde paralelliği nasıl buldukları ve sömürdükleri hakkında bazı ayrıntılara giriyor. (Çoğunlukla x86'ya odaklanır). Bu, aynı anda uçuşta birden fazla talimat alarak normal CPU'ların nasıl çalıştığının bir parçasıdır ve özel olarak etkinleştirmeniz gereken bir şey değildir. (Ancak, bir programı yürütürken CPU'nuzun saat başına kaç talimatı veya başka önlemleri almayı başarabileceğiniz performans sayaçları vardır.)
RPi3'ün sıralı ARM Cortex-A53 CPU çekirdeği kullandığını unutmayın . Her çekirdek 2 geniş süperskalar (ILP'nin izin verdiği saat başına 2 talimat), ancak daha fazla talimat düzeyinde paralellik bulmak ve gecikmeyi gizlemek için talimatları yeniden sıralayamaz.
Yine de, CPU boru hattına bağlanmıştır, bu nedenle uçuştaki toplam talimat sayısı (boru hattının sonunda geri getirme ve kod çözme işleminden sonuna kadar geri yazma aşamasına kadar) önemlidir. Veri bağımlılıkları bir şeyleri sınırlamadığında, CPU'nun üzerinde çalıştığı her boru hattı aşamasında 2 saat olabilir ve saat başına 2 komut verilebilir. (2 genişlik bu demektir.)
Talimatları arızalı olarak yürütemez, ancak dikkatli talimat siparişiyle (genellikle bir derleyici tarafından), çıktısının hazır olması için birden fazla döngü gerektiren bir komutun gecikmesini gizleyebilir. (örneğin, önbellekte veya çarpma işleminde vurulsa bile bir yük birden fazla döngü alacaktır, buna karşılık eklenti bir sonraki döngü için hazır olacaktır). İşin püf noktası asm talimatlarını sipariş etmektir, böylece sonuç üreten ile onu kullanan arasında birden fazla bağımsız talimat vardır.
Yazılımın (derleyici) statik olarak talimatlar programlaması, program sırasına göre çalışma yanılsamasını korurken dahili olarak yeniden sıralayabilecek donanıma sahip olmaktan daha kırılgandır. Derleyicilerin talimatları yeniden düzenlemek için küçük bir sıra dışı pencere kadar iyi bir iş yapması çok zordur, çünkü önbellek özümleri tahmin edilemez ve derleme zamanında işlev çağrıları arasındaki bağımlılık zincirlerini analiz etmek zordur. Ve kayıtların sayısı, donanım kaydı yeniden adlandırılmadan sınırlıdır.
Tüm bunlar, kodunuz istediğinizden daha yavaş çalıştığında küçük bir rahatlıktır. Elbette bir Cortex-A53'te kaputun altında çok güzel şeyler var, ancak bir Cortex-A57'de kaputun altında daha güzel şeyler var (saat başına 3 talimatın sıra dışı yürütülmesi gibi) ve hatta daha fazlası Skylake gibi büyük bir x86 CPU (saat hızı farklarından bahsetmiyorum).
Cortex-A53, bilgisayar mimarisi dersinde öğreneceğiniz orijinal MIPS gibi https://en.wikipedia.org/wiki/Classic_RISC_pipeline kıyasla oldukça harika , ancak modern standartlara göre oldukça düşük.