Kỹ thuật sử dụng vòng lặp For trong LabVIEW (Phần 2)

1
2014


Trước hết bạn hãy cùng quan sát hai Block diagram dưới đây.

Block diagram, For Loop, Auto-indexing, enable indexing, disable indexing, loop parallelism

Block diagram bên trái, thật dễ dàng để phát hiện ra vì sao mũi tên Run lại bị broken. Đó là do vòng lặp For chưa được xác định số vòng lặp (Đầu vào count terminal N chưa được nối với một giá trị quy định số vòng lặp sẽ thực thi). Song ở Block diagram bên phải, mặc dù ở đầu vào Count teminal N vẫn chưa có giá trị nào được nối nhưng lúc này mũi tên Run lại không bị broken nữa. Vì sao?

Đó là do tại bờ biên của vòng lặp For ta đã đưa vào một mảng Array và tại tunnel ta đã thiết lập chế độ truyền data từ mảng vào vòng lặp là Auto-indexing (Enable indexing). Điều đó có nghĩa rằng cỡ/size (Số phần tử) của mảng input sẽ quy định số lần lặp mà vòng lặp For sẽ thực hiện.

Để thay đổi chế độ pass (truyền data) từ mảng vào vòng lặp, click chuột phải tại đầu vào (tunnel input) của vòng lặp và chọn chế độ auto hay disable indexing như hình dưới đây.

Block diagram, For Loop, Auto-indexing, enable indexing, disable indexing, loop parallelism

Sự khác nhau giữa autodisable indexing là việc quy định cách thức truyền data qua tunnel của vòng lặp: Tất cả các phần tử của mảng (auto-indexing) hay tuần tự chỉ có từng phần tử (bắt đầu từ phần tử thứ nhất) của mảng được truyền qua (Disable indexing). Và trong Block diagram có sự khác nhau về hình dạng của một tunnel tại hai chế độ auto hay disable indexing. Bạn có thể thấy sự khác biệt này trong hai Block diagram trên. Bên phải là chế độ auto indexing, bên trái là chế độ disable indexing.

Một câu hỏi được đặt ra là nếu như cùng lúc nối vào count termial của vòng lặp For một giá trị A và một mảng có B phần tử được nối vào vòng lặp For ở chế độ Auto index thì vòng lặp For đó sẽ thực thi bao nhiêu lần. A lần hay B lần như Block diagram phía bên trên trong hình dưới đây (Theo đó A nhận giá trị 7 và B nhận giá trị 11). Một trường hợp khác nữa như Block diagram phía bên dưới thì số vòng lặp là bao nhiêu? (5, 7 hay 11)

Block diagram, For Loop, Auto-indexing, enable indexing, disable indexing, loop parallelism

Trong tất cả các trường hợp đó thì vòng lặp sẽ thực thi theo giá trị nhỏ nhất. Đối với Block diagram trên thì số vòng lặp thực thi là 7 và Block diagram dưới thì số vòng lặp là 5.

Tại đầu vào của vòng lặp For có sự khác biệt như vậy nhưng ở đầu ra (out put) của vòng lặp For liệu có sự khác biệt giữa hai chế độ pass data qua tunnel hay không? Bạn có thể tự trả lời câu hỏi đó dựa vào kết quả hiển thị trên Front Panel với Block diagram tương ứng bên cạnh như hình dưới đây. Một kết quả là cho ra một mảng và một kết quả chỉ là số hạng phản ánh phần tử cuối cùng của mảng đó.

Block diagram, For Loop, Auto-indexing, enable indexing, disable indexing, loop parallelism

Chúng ta thường xuyên sử dụng vòng lặp For trong lập trình LabVIEW với hai thành phần quen thuộc là Count terminal N (Quy định số vòng lặp) và interaction count i(luôn bắt đầu từ giá trị 0). Thế nhưng thử nhìn Block diagram dưới đây với cấu trúc vòng lặp For có thêm một chỉ số P (Block diagram bên trái) và có thêm cả chỉ số C (Block diagram bên phải), bạn có quá lạ lẫm với các chỉ số này và ý nghĩa của chúng?

Block diagram, For Loop, Auto-indexing, enable indexing, disable indexing, loop parallelism

Câu trả lời rất đơn giản đó là các tham số cho phép chúng ta thiết lập chế độ thực thi vòng lặp theo cơ chế song song trong những máy tính có bộ vi xử lí đa lõi (multi core). Theo đó, bằng việc thiết lập của chúng ta, máy tính sẽ phân chia các lõi đảm nhiệm một phần trách nhiệm của vòng lặp. Ví dụ như trong trường hợp lí tưởng, vòng lặp For có 10 lần lặp chạy trên máy tính dual core (hai core) thì chương trình sẽ phân chia mỗi core thực hiện 5 vòng lặp một cách song song. Thời gian thực thi sẽ giảm xuống một nửa so với việc ta không thiết lập cơ chế thực thi vòng lặp song song.

Làm thế nào để thiết lập và cấu hình cơ chế thực thi vòng lặp này một cách song song? Chúng ta chỉ đơn giản là click chuột phải lên vòng lặp và chọn thuộc tính “Configue interation parallelism” từ menu pop up của nó. Chi tiết cấu hình như hình ảnh dưới đây.

Block diagram, For Loop, Auto-indexing, enable indexing, disable indexing, loop parallelism

Tất nhiên, không phải vòng lặp nào cũng có thể thiết lập để nó thực thi với chế độ song song được. Tuỳ thuộc vào cấu trúc code bên trong của vòng lặp For, mối liên hệ của vòng lặp đó với các yếu tố khác trong Block diagram mà vòng lặp đó có thể chạy ở chế độ song song hay không? Việc này thực ra đòi hỏi người lập trình phải có một sự hiểu biết nhất định về phần cứng, kỹ thuật nâng cao trong lập trình. Song vì LabVIEW vốn là một ngôn ngữ giành cho những kỹ sư và nhà khoa học có thể không chuyên về lập trình nên LabVIEW hỗ trợ một công cụ cho phép chúng ta kiểm tra xem liệu một đoạn code trong một vòng lặp nào đó có thể chạy ở chế độ song song hay không. Công cụ đó nằm trong Tool»Profile»Find Parallelizable loop…

Block diagram, For Loop, Auto-indexing, enable indexing, disable indexing, loop parallelism

Sau khi gọi tính năng này từ Block diagram, cửa sổ kết quả Find Parallelizable loop Result sẽ cho ta biết vòng lặp nào thì có thể chạy được song song.

Block diagram, For Loop, Auto-indexing, enable indexing, disable indexing, loop parallelism

 Còn nữa…