นอกเหนือจากประเด็นที่กล่าวถึงในคำตอบอื่น ๆ (ยากที่จะพิสูจน์ว่าการดำเนินงานมีความเป็นอิสระและโปรแกรมเมอร์คิดว่าลำดับ) มีปัจจัยที่สามที่ต้องพิจารณา: ค่าใช้จ่ายของการขนาน
ความจริงก็คือการขนานของเธรดนั้นมีค่าใช้จ่ายที่สำคัญมาก
การสร้างเธรดมีราคาแพงมาก : สำหรับเคอร์เนลการเริ่มเธรดจะเหมือนกับการเริ่มต้นกระบวนการ ฉันไม่แน่ใจเกี่ยวกับค่าใช้จ่ายที่แม่นยำ แต่ฉันเชื่อว่ามันอยู่ในคำสั่งของสิบไมโครวินาที
การสื่อสารด้วยเธรดผ่าน mutexes นั้นมีราคาแพง: โดยปกติสิ่งนี้ต้องมีการเรียกใช้ระบบในแต่ละด้านซึ่งอาจทำให้เธรดเข้าสู่โหมดสลีปและปลุกอีกครั้งซึ่งทำให้เกิดความหน่วงแฝงเช่นเดียวกับแคชเย็นและ TLB ที่ล้าง โดยเฉลี่ยการรับและปล่อยค่า mutex ประมาณหนึ่ง microsecond
จนถึงตอนนี้ดีมาก เหตุใดจึงเป็นปัญหาสำหรับการขนานโดยนัย? เพราะการขนานโดยปริยายนั้นง่ายที่สุดที่จะพิสูจน์ในสเกลเล็ก ๆ มันเป็นสิ่งหนึ่งที่จะพิสูจน์ได้ว่าการวนซ้ำสองครั้งของลูปแบบง่าย ๆ นั้นเป็นอิสระจากกันมันเป็นสิ่งที่แตกต่างกันอย่างสิ้นเชิงในการพิสูจน์ว่าการพิมพ์บางสิ่งไปยังstdout
และการส่งเคียวรีไปยังฐานข้อมูลนั้นเป็นอิสระต่อกัน กระบวนการฐานข้อมูลอาจอยู่อีกด้านหนึ่งของไปป์!)
นั่นคือการขนานโดยนัยที่โปรแกรมคอมพิวเตอร์สามารถพิสูจน์ได้ว่าไม่สามารถใช้ประโยชน์ได้เนื่องจากค่าใช้จ่ายในการขนานนั้นมากกว่าข้อดีของการประมวลผลแบบขนาน ในทางตรงกันข้ามการขนานขนาดใหญ่ที่สามารถเร่งความเร็วแอปพลิเคชันไม่สามารถพิสูจน์ได้สำหรับคอมไพเลอร์ แค่คิดว่าซีพียูทำงานได้มากแค่ไหนในหนึ่งวินาที ทีนี้ถ้าขนานกันควรจะเร็วกว่าโปรแกรมอนุกรมโปรแกรมขนานจะต้องสามารถทำให้ซีพียูทั้งหมดไม่ว่างเป็นเวลาหลายไมโครวินาทีระหว่างการเรียก mutex สองครั้ง ที่ต้องใช้การขนานที่มีเนื้อหยาบอย่างแท้จริงซึ่งแทบเป็นไปไม่ได้ที่จะพิสูจน์โดยอัตโนมัติ
ในที่สุดก็ไม่มีกฎโดยไม่มีข้อยกเว้น: การเอารัดเอาเปรียบของความเท่าเทียมโดยปริยายทำงานที่ไม่เกี่ยวข้องกับกระทู้ซึ่งเป็นกรณีที่มี vectorization ของรหัส (ใช้ชุดคำสั่ง SIMD เช่น AVX, Altivec ฯลฯ ) ที่ได้ผลดีที่สุดสำหรับการขนานขนาดเล็กที่ค่อนข้างง่ายต่อการพิสูจน์