Diğer cevaplarda belirtilen hususların yanı sıra (operasyonların bağımsız olduğunu ve programcıların seri olarak düşündüğünü kanıtlamak zor), dikkate alınması gereken üçüncü bir faktör vardır: paralelleştirme maliyeti .
Gerçek şu ki, iplik paralelliğinin kendisiyle ilişkili çok önemli maliyetleri vardır:
İş parçacığı oluşturma çok pahalıdır: Çekirdek için bir iş parçacığının başlatılması, bir işlemin başlatılmasıyla hemen hemen aynıdır. Kesin maliyetlerden emin değilim, ama bunun on mikrosaniye civarında olduğuna inanıyorum.
Muteksler aracılığıyla iş parçacığı iletişimi pahalıdır: Genellikle, bu her iki tarafta bir sistem çağrısı gerektirir, muhtemelen bir ipliği uykuya geçirir ve tekrar uyandırır, bu da gecikmeyi, soğuk önbellekleri ve kızartılmış TLB'leri üretir. Ortalama olarak, bir muteksin alınması ve bırakılması bir mikrosaniye civarındadır.
Çok uzak çok iyi. Bu, örtük paralellik için neden bir sorundur? Çünkü örtük paralellik, küçük ölçeklerde kanıtlanması en kolay yoldur. Basit bir döngünün iki yinelemesinin birbirinden bağımsız olduğunu kanıtlamak bir şeydir, bir şey yazdırmanın stdout
ve bir veritabanına sorgu göndermenin birbirinden bağımsız olduğunu ve paralel olarak yürütülebildiğini kanıtlamak tamamen farklı bir şeydir ( veritabanı işlemi borunun diğer tarafında olabilir!).
Yani, bir bilgisayar programının kanıtlayabileceği örtük paralellik muhtemelen patlayıcı değildir, çünkü paralelleştirme maliyetleri paralel işlemenin avantajından daha yüksektir. Öte yandan, bir uygulamayı gerçekten hızlandırabilen büyük ölçekli paralellik bir derleyici için geçerli değildir. Sadece bir CPU'nun mikrosaniye içinde ne kadar iş yapabileceğini düşünün. Şimdi, paralelleştirmenin seri programdan daha hızlı olması gerekiyorsa, paralel program tüm CPU'ları iki muteks çağrısı arasında birkaç mikrosaniye boyunca meşgul tutabilmelidir. Bu, otomatik olarak kanıtlanması neredeyse imkansız olan gerçekten kaba taneli paralellik gerektirir.
Son olarak, istisnasız kural yok: Örtük paralelliğin sömürülmesi, hiçbir iş parçacığının yer almadığı durumlarda çalışır, bu da kodun vektörleştirilmesinde (AVX, Altivec vb. SIMD komut kümelerini kullanarak) geçerlidir. Bu, kanıtlanması nispeten kolay olan küçük ölçekli paralellik için en iyi sonucu verir.