CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.
Bài viết trên blog CFSDN này nói sơ qua về tính song song dữ liệu trong tính toán song song .Net, được tác giả sưu tầm và biên soạn. Nếu bạn quan tâm đến bài viết này thì nhớ like nhé.
Công nghệ phần cứng máy tính đã phát triển vượt bậc kể từ khi chiếc máy tính đầu tiên ra đời cho đến nay. Cho dù đó là PC được sử dụng bởi cá nhân hay máy chủ được sử dụng bởi công ty. CPU lõi kép, lõi tứ và tám lõi đã rất phổ biến. Bằng cách này, chúng ta có thể phân bổ chương trình của mình cho nhiều CPU máy tính để tính toán. Trước đây, việc song song hóa yêu cầu các hoạt động ở mức độ thấp của các luồng, điều này rất khó khăn trong .net4.0, việc hỗ trợ song song hóa đã được nâng cao, khiến điều này trở nên khó khăn. dễ dàng hơn. Rất đơn giản. Lần này tôi sẽ nói về tính song song của .NET từ các khía cạnh sau.
1. Song song dữ liệu 2. Song song nhiệm vụ 3. Linq song song 4. Nhà máy nhiệm vụ 5. Các biện pháp phòng ngừa.
Lần này tôi sẽ chủ yếu nói chuyện với bạn về tính song song của dữ liệu. Không cần phải nói nhiều nữa, hãy bắt đầu.
Song song dữ liệu thực sự đề cập đến việc phân vùng dữ liệu trong bộ sưu tập hoặc mảng ban đầu, sau đó phân bổ nó cho nhiều CPU hoặc nhiều luồng để thực hiện cùng một thao tác System.Threading.Tasks trong .net cung cấp một lớp hỗ trợ cho song song dữ liệu, Parallel .For, Parallel.ForEach rất giống với for và foreach mà chúng ta thường sử dụng. Bạn không cần tạo hàng đợi luồng và cũng không cần sử dụng khóa trong vòng lặp cơ bản. .net sẽ xử lý những việc này cho bạn, bạn chỉ cần tập trung vào công việc kinh doanh của riêng mình. Sau đó, hãy xem cách Parallel.For và Parallel.ForEach được sử dụng.
• Parallel.For sử dụng đơn giản.
。
Sao chép mãMã này như sau:
Song song. Đối với (0, 100, i => {
cuộc họp liều lượng()
});
。
Ví dụ trên không phải là cái bóng của vòng lặp for mà chúng ta thường sử dụng. Hãy nói về tham số thứ ba kiểu Action của Parallel.For. Cho dù tham số của delegate này là 0 hay bao nhiêu thì giá trị trả về của nó vẫn là void. Vậy làm cách nào chúng ta có thể nhận được giá trị trả về trong Parallel.For? Bây giờ, ví dụ sau đây minh họa cách sử dụng các biến cục bộ của luồng để lưu trữ và truy xuất trạng thái trong từng tác vụ riêng lẻ được tạo bởi vòng lặp for. Bằng cách sử dụng dữ liệu cục bộ theo luồng, bạn tránh được chi phí đồng bộ hóa các quyền truy cập lớn vào trạng thái được chia sẻ. Thay vì ghi vào tài nguyên được chia sẻ trên mỗi lần lặp, bạn sẽ tính toán và lưu trữ giá trị cho đến khi tất cả các lần lặp của tác vụ hoàn tất. Sau đó, bạn có thể ghi kết quả cuối cùng vào tài nguyên được chia sẻ trong một lần hoặc chuyển nó sang một phương thức khác.
•Tính tổng từng danh sách. Ở đây chúng ta giả định rằng độ dài của Danh sách là listLength.
Sao chép mãMã này như sau:
Parallel.For(0, listLength, () => 0, (j, vòng lặp, subsum) => { subsum += lista[j]; trả về subsum,
。
}, (x) => Liên kết. Thêm(tổng tham chiếu, x)),
。
•Trong thực tế, chúng ta thường gặp phải tình huống cần hủy bỏ chu trình. Ví dụ: bạn đang tìm kiếm một số trong hàng đợi. Vậy làm sao để thoát khỏi vòng lặp Parallel.For. Có thể chỉ sử dụng từ khóa Break như for và foreach không? Điều này là do cấu trúc break có hiệu lực đối với các vòng lặp và các vòng lặp song song thực sự là một phương thức chứ không phải cách hủy vòng lặp. Xin vui lòng xem ví dụ dưới đây.
Sao chép mãMã này như sau:
Parallel.For(0, listLength, () => 0, (j, loop, subsum) => { if (subsum > 20000) { loop.Break(); } 。
。
phụ += danh sách[j]; quay trở lại
}, (x) => Liên kết. Thêm(tổng tham chiếu, x)),
。
• Vòng lặp Parallel.ForEach đơn giản Vòng lặp Parallel.ForEach hoạt động tương tự như vòng lặp Parallel.For, phân vùng bộ sưu tập nguồn và lên lịch làm việc trên nhiều luồng theo môi trường hệ thống. Càng có nhiều bộ xử lý trong hệ thống thì phương pháp song song sẽ chạy càng nhanh. Đối với một số bộ sưu tập nguồn, vòng lặp tuần tự có thể nhanh hơn, tùy thuộc vào kích thước của nguồn và loại công việc đang được thực hiện.
。
Sao chép mãMã này như sau:
Parallel.ForEach(danh sách, i => { liều lượng(); });
。
Tôi không biết bạn có nhìn thấy bóng dáng của foreach ở nơi này hay không. Trong thực tế, tham số đầu vào cuối cùng của phương thức ForEach trong ví dụ trên là ủy nhiệm Action, phương thức này sẽ gọi khi tất cả các vòng lặp hoàn thành. Nơi này giống như Parallel.For trước đó. Vậy cách chúng ta lấy giá trị trả về rất giống với For ở trên mình vẫn lấy phép tính tổng mảng ở trên làm ví dụ.
。
Sao chép mãMã này như sau:
Parallel.ForEach(lista, () => 0, (j, loop, subsum) => { if (subsum > 20000) { loop.Break(); } subsum += lista[j]; return subsum; }, (x) => Interlocked.Add(ref sum, x)),
。
。
。
• Parallel.For và để so sánh kiểm tra hiệu suất Ở đây chúng tôi tạo ra 10 triệu số ngẫu nhiên làm ví dụ để so sánh hiệu suất. Kết quả trên sổ ghi chép của tác giả như sau (kết quả có thể không giống nhau trên máy tính của bạn).
Kèm theo là mã có liên quan để bạn tham khảo.
。
Sao chép mãMã này như sau:
int listLength = 10000000; List listTask = new List(); List list = new List(); Đồng hồ bấm giờ watch1 = Stopwatch.StartNew(),
。
Parallel.For(0, listLength, i => { Random r = new Random(100); listTask.Add(r.Next()); }); Console.WriteLine("Tiêu thụ thời gian song song:" + watch1.ElapsedMilliseconds ) ;
Đồng hồ bấm giờ watch2 = Đồng hồ bấm giờ.StartNew(),
đối với (int i = 0; i < listLength; i++) { Ngẫu nhiên r = new Ngẫu nhiên(100); list.Add(r.Next()); } 。
Console.WriteLine("Tiêu tốn thời gian không song song:" + watch2.ElapsedMilliseconds),
。
Cuối cùng, bài viết về song song dữ liệu trong tính toán song song .Net kết thúc ở đây. Nếu bạn muốn biết thêm về song song dữ liệu trong tính toán song song .Net, vui lòng tìm kiếm các bài viết về CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng tất cả các bạn sẽ ủng hộ blog của tôi. trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!