2016-11-11 42 views
5

Như tôi có thể hiểu, C++ 17 sẽ đi kèm với Parallelism. Tuy nhiên, những gì tôi không thể hiểu được nó là một phần cứng song song cụ thể (CPU theo mặc định)? Hoặc nó có thể được mở rộng đến bất kỳ phần cứng nào với nhiều đơn vị tính toán?C++ 17 thực hiện phần cứng song song

Nói cách khác, chúng ta sẽ thấy một cái gì đó như, ví dụ, "trình biên dịch chuẩn nVidia C++" sẽ biên dịch các phần song song được thực thi trên GPU?

Đây có phải là một số giải pháp thay thế tiêu chuẩn hơn cho OpenCL không?

Lưu ý: Tuyệt đối, tôi là không phải " hỏi" Will nVidia sẽ làm điều đó? ". Tôi hỏi nếu các tiêu chuẩn C++ 17 cho phép điều đó và nếu nó có thể về mặt lý thuyết.

Trả lời

2

Câu hỏi cung cấp liên kết đến bài viết đề xuất thay đổi này, và, đối với các khía cạnh song song, chưa có thay đổi đáng kể đối với những gì được đề xuất. Có, trình biên dịch có thể làm bất cứ điều gì có ý nghĩa cho phần cứng đích để song song với việc thực hiện các thuật toán khác nhau, chỉ cung cấp câu trả lời đúng (với một số đặt chỗ) và nó không áp đặt chi phí không cần thiết (một lần nữa, với một số đặt chỗ) .

Có một vài điểm quan trọng cần hiểu.

Đầu tiên, C++ 17 song song là không một cơ chế lập trình song song chung. Nó cung cấp các phiên bản song song của nhiều thuật toán STL, không có gì hơn. Vì vậy, nó không phải là một sự thay thế cho các cơ chế mạnh mẽ hơn như OpenCL, TBB, v.v.

Thứ hai, có những hạn chế cố hữu khi bạn cố gắng song song các thuật toán, và đó là lý do tại sao tôi thêm hai trình độ đó. Ví dụ, phiên bản song song của std::accumulate sẽ tạo ra kết quả tương tự như phiên bản không song song chỉ khi chức năng được áp dụng cho phạm vi nhập liệu là giao hoán và liên kết. Vùng vấn đề rõ ràng nhất ở đây là các giá trị dấu phẩy động, ở đó các phép tính toán không liên kết, do đó kết quả có thể khác nhau. Tương tự, một số thuật toán thực sự áp đặt nhiều chi phí hơn khi được song song; bạn nhận được một tốc độ ròng, nhưng có tổng số công việc được thực hiện, do đó, tốc độ cho những thuật toán sẽ không được tuyến tính trong số lượng các đơn vị xử lý. std::partial_sum là một ví dụ: mỗi giá trị đầu ra phụ thuộc vào giá trị trước đó, vì vậy nó không đơn giản để song song với thuật toán. Có nhiều cách để làm điều đó, nhưng bạn kết thúc việc áp dụng hàm kết hợp nhiều lần so với thuật toán không song song. Nói chung, có sự thư giãn về các yêu cầu phức tạp cho các thuật toán để phản ánh thực tế này.

+0

Cảm ơn bạn đã dành thời gian viết câu trả lời chi tiết này. "C++ 17 song song không phải là một cơ chế lập trình song song chung" Nếu tôi hiểu bạn một cách chính xác, chúng tôi sẽ không thấy một cái gì đó như "std :: call_kernal <512,512> (kernal1);" ? –

+1

@HumamHelfawi - không, bạn sẽ không thấy điều đó. Nó ** chỉ ** ảnh hưởng đến một số (hầu hết) các thuật toán STL; như được mô tả trong bài báo bạn đã liên kết, chúng có thể được gọi với một đối số bổ sung yêu cầu thuật toán được thực hiện song song. –

+1

Đó là lý do tại sao 'std :: accumulate' không có quá tải song song và chúng tôi nhận' std :: reduce' thay thế. Tương tự như vậy đối với 'partial_sum' =>' {inclusive, exclusive} _scan'. –

Các vấn đề liên quan