Ngoài những điểm được đề cập trong các câu trả lời khác (khó chứng minh rằng các hoạt động là độc lập và các lập trình viên nghĩ theo kiểu thanh thản), còn có một yếu tố thứ ba cần được xem xét: chi phí song song.
Sự thật là, song song luồng có chi phí rất đáng kể liên quan đến nó:
Tạo chủ đề rất tốn kém: Đối với Kernel, bắt đầu một chủ đề cũng giống như bắt đầu một quy trình. Tôi không chắc về chi phí chính xác, nhưng tôi tin rằng nó theo thứ tự mười micro giây.
Giao tiếp luồng thông qua mutexes rất tốn kém: Thông thường, điều này đòi hỏi một cuộc gọi hệ thống ở mỗi bên, có thể đặt một luồng để ngủ và đánh thức nó một lần nữa, điều này tạo ra độ trễ cũng như bộ đệm lạnh và TLB bị dội. Trung bình, lấy và phát hành một mutex chi phí khoảng một micro giây.
Càng xa càng tốt. Tại sao điều này là một vấn đề cho song song ngầm? Bởi vì song song ngầm là dễ nhất để chứng minh trên quy mô nhỏ. Đó là một điều để chứng minh rằng hai lần lặp của một vòng lặp đơn giản là độc lập với nhau, đó là một điều hoàn toàn khác để chứng minh rằng việc in một cái gì đó đến stdout
và gửi một truy vấn đến cơ sở dữ liệu là độc lập với nhau và có thể được thực thi song song ( quá trình cơ sở dữ liệu có thể ở phía bên kia của đường ống!).
Đó là, sự song song ngầm mà một chương trình máy tính có thể chứng minh có khả năng không thể khai thác được vì chi phí song song lớn hơn lợi thế của xử lý song song. Mặt khác, sự song song quy mô lớn có thể thực sự tăng tốc một ứng dụng là không thể chứng minh được đối với trình biên dịch. Chỉ cần nghĩ về việc CPU có thể làm được bao nhiêu trong một phần triệu giây. Bây giờ, nếu việc song song hóa được cho là nhanh hơn chương trình nối tiếp, chương trình song song phải có khả năng giữ cho tất cả các CPU bận rộn trong vài micro giây giữa hai cuộc gọi mutex. Điều đó đòi hỏi sự song song thực sự thô, điều gần như không thể chứng minh tự động.
Cuối cùng, không có quy tắc nào mà không có ngoại lệ: Khai thác song song ẩn hoạt động trong đó không có luồng nào liên quan, đó là trường hợp vector hóa mã (sử dụng các tập lệnh SIMD như AVX, Altivec, v.v.). Điều đó thực sự hoạt động tốt nhất cho song song quy mô nhỏ tương đối dễ chứng minh.