2014-11-29 22 views
11

TParallel.For() có đối số được gọi là AStride. Trong trường hợp của tôi AStride là 2:Ý nghĩa của AStride trong TParallel.For là gì?

TParallel.&For(2, 1, 10, 
    procedure(index: Integer) 
    begin 
     TThread.Queue(nil, 
     procedure 
     begin 
      memo1.Lines.Add(index.ToString()); 
     end 
    ); 
    end 
); 

Tôi không thể hiểu ý nghĩa kỹ thuật của "AStride" tại đây. Có AStride = 2 có nghĩa là chuỗi đầu tiên sẽ xử lý hai số liên tiếp trong phạm vi [1..10], luồng thứ hai sẽ xử lý các số liên tiếp tiếp theo, v.v ...?

** Tiếng Anh không phải là ngôn ngữ mẹ đẻ của tôi và tôi dịch "Stride" thành "bước dài" hoặc "tốc độ".

Trả lời

12

Người ta có thể bị cám dỗ để nghĩ rằng câu trả lời có thể được tìm thấy trong documentation:

astride: Các Integer đại diện cho tăng của lần lặp.

Tôi đã đọc điều đó như ngụ ý rằng các giá trị biến vòng lặp là 1, 3, 5, 7 và 9. Tuy nhiên, không phải như vậy. Chương trình này:

{$APPTYPE CONSOLE} 
uses 
    System.Threading; 

var 
    Lock: TMonitor; 
    LockObj: TObject; 

procedure Proc(Index: Integer); 
begin 
    Lock.Enter(LockObj); 
    Writeln(Index); 
    Lock.Exit(LockObj); 
end; 

begin 
    LockObj := TObject.Create; 
    TParallel.&For(2, 1, 10, Proc); 
end. 

xuất ra mười số từ 1 đến 10.

Thực tế, thông số sải chân cho phép bạn điều chỉnh hiệu suất. Song song cho vòng lặp sử dụng một hồ bơi thread để lên lịch công việc. Nếu các gói công việc là rất nhỏ thì chi phí đồng bộ hóa bên trong nhóm luồng có thể chi phối hiệu suất. Cách để giải quyết vấn đề này là đảm bảo rằng các gói công việc đủ lớn để chiếm lĩnh chi phí đồng bộ hóa.

Sải chân cho phép bạn đạt được điều này. Trong ví dụ của bạn, chỉ số vòng lặp giá trị 1 và 2 được thực hiện như một phần công việc. Các giá trị chỉ mục 3 và 4 là một phần công việc khác. Và cứ thế. Bằng cách nhóm nhiều chỉ mục thành một phần công việc duy nhất, lượng thời gian dành cho chi phí đồng bộ hóa sẽ giảm.

+0

Tôi hy vọng thông số bạn đã mong đợi từ bước này sẽ được mô tả và đặt tên là bước lặp lại hoặc bước truy cập (nếu họ giới thiệu nó). Ngoài tò mò, họ có sử dụng API pool pool trên nền tảng Windows không? – TLama

+2

@TLama Tôi nghi ngờ họ sẽ thêm một tham số như vậy vì nó dễ dàng cho lập trình viên để làm như vậy. Parallel.For triển khai khác làm việc ra "sải chân" mình nghĩ. Hồ bơi thread có nguồn gốc từ Delphi RTL. Vì vậy, không phải là hồ bơi hệ thống thread. –

+0

Ngoài ra, sải chân là "tự điều chỉnh". I E. khi không có giá trị bắt đầu được cho nó tăng định kỳ. Tôi nghĩ, điều này được thực hiện để chống lại việc chia sẻ sai trong các vòng chạy dài. – iamjoosy