Các nhà phát triển cần xây dựng các ứng dụng song song có hiệu quả và đáng tin cậy để chia sẻ tài nguyên hệ thống. Tuy nhiên, song song thông qua các mô hình lập trình đa luồng truyền thống ngày nay là khó thực hiện và dễ bị lỗi trừ các ứng dụng đơn giản nhất.
Để viết code song song hiệu quả, một nhà phát triển phải thực hiện hai chức năng chính: xác định khả năng cho xử lý song song vấn đề và ánh xạ các mã tới các phần cứng đa lõi. Cả hai chức năng là tốn thời gian, khó khăn, và dễ bị lỗi, vì có rất nhiều các yếu tố phụ thuộc để theo dõi, chẳng hạn như bộ nhớ và lập kế hoạch bố trí cân bằng các lõi. Hơn nữa, các ứng dụng song song có thể được kiểm tra, gỡ lỗi, và phân tích về tính chính xác của các chức năng, do đó chúng thường xuyên bị phát hiện các lỗi tinh tế và các vấn đề hiệu suất của chương trình. Các công cụ gỡ lỗi và thiết kế xây dựng các ứng dụng trên máy tính để lõi đơn gặp khó khăn khi phải đối mặt với những thách thức như vậy trong xử lý trên nhiều lõi.
Một số thách thức, hoặc các vấn đề khó khăn phải được giải quyết trước khi song song có thể được triển khai rộng rãi hơn, bao gồm:
Làm thế nào để thể hiện và khai thác được xử lý song song.
Làm thế nào để phối hợp các truy cập song song tới trạng thái chung.
Làm thế nào để kiểm tra tính đúng đắn, gỡ lỗi chương trình và tăng hiệu suất. Cụ thể hơn:
Thể hiện và khai thác được xử lý song song
Xử lý song song bởi nhiều lõi có một nhiệm vụ là lấy một công việc và phân chia nó thành các công việc con mà độc lập với nhau, và sau đó có thể được xử lý bởi các lõi. Sau đó, các chức năng cơ bản của các ngôn ngữ lập trình là để mô tả nhiệm vụ thực hiện dựa trên trình tự các công việc con. Khả năng để xác định việc thực hiện đồng thời các công việc con là một mô hình lập trình mới, vì vậy, nó đòi hỏi một sự thay đổi cơ bản trong phương pháp lập trình. Chúng ta gọi đây là “fine-grained concurrency” để làm nổi bật sự thay đổi sâu sắc này với những tính toán đồng thời khác, ví dụ như quản lý không đồng bộ vào ra (asynchronous I /O).
Viết chương trình thể hiện và khai thác “fine-grained concurrency” vốn khó khăn hơn so với viết chương trình tuần tự bởi các khái niệm, tư tưởng mới mà lập trình viên phải nắm được và những đặc tính của xử lý song song được thể hiện trên chương trình.
Đứng đầu trong số những vấn đề này là không lường trước được nguy cơ gây ra lỗi khi tương tác giữa các đối tượng mà bộ nhớ được chia sẻ và những khó khăn khi chứng minh rằng không có lỗi như thế tồn tại trong một chương trình.
Để sử dụng lại code và để tối đa hóa lợi ích của việc song song, các lập trình viên cần đảm bảo rằng việc tính toán song song bên trong các thành phần không không liên quan đến đặc tả giao diện bên ngoài. Khi các thành phần mới được phát triển có thể khai thác được xử lý song song, chúng có thể thay thế các thành phần cũ trong khi vẫn giữ tất cả các giao diện ứng dụng người dùng. Không xây dựng cấu trúc khi tính toán song song có thể khiến lỗi gặp phải trở nên trầm trọng hơn.
Ngoài ra, khi thành phần con của chương trình có thể được song song hóa thoải mái, một hệ thống phần cứng có thể phải xử lý song song nhiều hơn cần thiết trong sử dụng các tài nguyên sẵn có. Các nhà phát triển (hoặc các chương trình ứng dụng) phải có khả năng quản lý các nhu cầu về tài nguyên hệ thống của các thành phần chương trình khác nhau.
Phối hợp truy cập song song tới trạng thái được chia sẻ
Vấn đề khó khăn thứ hai cho các nhà lập trình song song bao gồm việc quản lý các biến được chia sẻ và bị thay đổi bởi các công việc (tasks) trong một ứng dụng. Lập trình viên cần có sự trừu tượng hóa tốt hơn so với những gì hiện có để phối hợp truy cập ứng dụng song song tới trạng thái chung; họ cũng cần có cách làm tốt hơn để xây dựng tài liệu và hạn chế những ảnh hưởng xấu của các hàm chức năng tới trạng thái của ứng dụng. Kết hợp các mô hình tính toán song song sang các ngôn ngữ lập trình phổ biến, chẳng hạn như C + +, C #, và Microsoft Visual Basic, không phải là dễ dàng. Một cách đơn giản là tăng thêm các cơ chế đồng bộ hóa trong các ngôn ngữ như ổ khóa và các biến sự kiện nhằm thông tin về mục mới của lỗi không có trong ngôn ngữ cơ bản.
Bất kỳ giải pháp nào cho vấn đề tính toán song song phải giải quyết ba vấn đề riêng biệt:
Trật tự sắp xếp của các tính toán nhỏ.
Tập hợp các cập nhật chưa được sắp xếp tới trạng thái chia sẻ (ví dụ biến dùng chung).
Việc quản lý các nguồn tài nguyên được chia sẻ.
Một vấn đề khó khăn thứ ba là kiểm tra tính đúng đắ, gỡ lỗi và hiệu suất chương trình. Xử lý song song có thêm các yêu cầu trên tất cả các giai đoạn phát triển của ứng dụng. Lịch trình kết quả phụ thuộc vào khả năng có thể làm xử lý theo mũ hay không. Không thể áp dụng các cách gỡ lỗi của chương trình ứng dụng lập trình tuần tự cho các chương trình được xử lý song song. Một vấn đề phức tạp hơn là việc kiểm soát lượng lớn các trạng thái, các biến dùng chung của hệ thống. Với hàng trăm công việc con được chạy trong tiến trình, không thể xác định rõ ràng chương trình chạy đang ở giai đoạn nào hoặc những trạng thái của nó đang được cập nhật đến đâu.
Tính toán song song cũng giới thiệu cái nhìn mới cho những vấn đề về phân tích và điều chỉnh khả năng chạy của chương trình, đồng thời nhấn mạnh về vấn đề này. Ngoài một số thao tác đơn giản, một chương trình được lập trình song song bây giờ phải quan tâm về số lượng xử lý đồng thời, các chí phí liên quan đến xử lý ấy, và khả năng xung đột khi các hoạt động đồng thời cùng lúc truy cập vào dữ liệu được chia sẻ. Đây là tất cả những vấn đề mới mà lập trình viên tuần tự chưa gặp phải.