Terlepas dari poin yang disebutkan dalam jawaban lain (sulit untuk membuktikan bahwa operasi adalah independen, dan programmer berpikir secara seri), ada faktor ketiga yang perlu dipertimbangkan: biaya paralelisasi.
Yang benar adalah, paralelisme utas itu memiliki biaya yang sangat signifikan terkait dengannya:
Pembuatan utas sangat mahal: Untuk Kernel, memulai utas hampir sama dengan memulai suatu proses. Saya tidak yakin tentang biaya yang tepat, tetapi saya percaya itu dalam urutan sepuluh mikrodetik.
Komunikasi utas melalui mutex itu mahal: Biasanya, ini membutuhkan panggilan sistem di setiap sisi, mungkin menempatkan utas untuk tidur dan membangunkannya lagi, yang menghasilkan latensi serta cache dingin dan TLB yang memerah. Rata-rata, mengambil dan melepaskan biaya mutex sekitar satu mikrodetik.
Sejauh ini baik. Mengapa ini masalah paralelisme implisit? Karena paralelisme implisit paling mudah untuk dibuktikan pada skala kecil. Ini adalah satu hal untuk membuktikan bahwa dua iterasi dari loop sederhana adalah independen satu sama lain, itu adalah hal yang sama sekali berbeda untuk membuktikan bahwa mencetak sesuatu ke stdout
dan mengirim permintaan ke database independen satu sama lain dan dapat dieksekusi secara paralel ( proses database bisa di sisi lain dari pipa!).
Artinya, paralelisme implisit yang dapat dibuktikan program komputer kemungkinan tidak dapat dieksploitasi karena biaya paralelisasi lebih besar daripada keuntungan pemrosesan paralel. Di sisi lain, paralelisme skala besar yang benar-benar dapat mempercepat aplikasi tidak dapat dibuktikan untuk kompiler. Coba pikirkan berapa banyak pekerjaan yang dapat dilakukan CPU dalam mikrodetik. Sekarang, jika paralelisasi seharusnya lebih cepat daripada program serial, program paralel harus dapat membuat semua CPU sibuk selama beberapa mikrodetik antara dua panggilan mutex. Itu membutuhkan paralelisme berbutir kasar, yang hampir tidak mungkin dibuktikan secara otomatis.
Akhirnya, tidak ada aturan tanpa pengecualian: Eksploitasi paralelisme implisit bekerja di mana tidak ada utas yang terlibat, yang merupakan kasus dengan vektorisasi kode (menggunakan set instruksi SIMD seperti AVX, Altivec, dll.). Itu memang bekerja paling baik untuk paralelisme skala kecil yang relatif mudah dibuktikan.