Vectorization, nói một cách đơn giản, có nghĩa là tối ưu hóa thuật toán để nó có thể sử dụng các hướng dẫn SIMD trong bộ xử lý.
AVX, AVX2 và AVX512 là các tập lệnh (intel) thực hiện cùng một hoạt động trên nhiều dữ liệu trong một lệnh. ví dụ AVX512 có nghĩa là bạn có thể hoạt động trên 16 giá trị số nguyên (4 byte) tại một thời điểm. Điều đó có nghĩa là nếu bạn có vectơ gồm 16 số nguyên và bạn muốn nhân đôi giá trị đó trong mỗi số nguyên và sau đó thêm 10 vào số nguyên đó. Bạn có thể tải các giá trị vào thanh ghi chung [a, b, c] 16 lần và thực hiện cùng một thao tác hoặc bạn có thể thực hiện cùng một thao tác bằng cách tải tất cả 16 giá trị vào các thanh ghi SIMD [xmm, ymm] và thực hiện thao tác một lần. Điều này cho phép tăng tốc tính toán của dữ liệu vectơ.
Trong vector hóa, chúng tôi sử dụng điều này cho lợi thế của mình, bằng cách sửa sang lại dữ liệu của chúng tôi để chúng tôi có thể thực hiện các hoạt động SIMD trên đó và tăng tốc chương trình.
Chỉ có vấn đề với vector hóa là điều kiện xử lý. Bởi vì điều kiện phân nhánh dòng chảy thực thi. Điều này có thể được xử lý bằng cách che dấu. Bằng cách mô hình hóa điều kiện thành một phép toán số học. ví dụ. nếu chúng ta muốn thêm 10 vào giá trị nếu nó lớn hơn 100. chúng ta có thể.
if(x[i] > 100) x[i] += 10; // this will branch execution flow.
hoặc chúng ta có thể mô hình hóa điều kiện thành phép toán số học tạo ra một vectơ điều kiện c,
c[i] = x[i] > 100; // storing the condition on masking vector
x[i] = x[i] + (c[i] & 10) // using mask
đây là ví dụ rất nhỏ mặc dù ... do đó, c là vectơ che dấu mà chúng ta sử dụng để thực hiện thao tác nhị phân dựa trên giá trị của nó. Điều này tránh phân nhánh dòng thực thi và cho phép vector hóa.
Vector hóa cũng quan trọng như Parallelization. Vì vậy, chúng ta nên sử dụng nó càng nhiều càng tốt. Tất cả các bộ xử lý hiện đại đều có hướng dẫn SIMD cho khối lượng công việc tính toán nặng. Chúng tôi có thể tối ưu hóa mã của mình để sử dụng các hướng dẫn SIMD này bằng cách sử dụng vector hóa, điều này tương tự như song song hóa mã của chúng tôi để chạy trên nhiều lõi có sẵn trên các bộ xử lý hiện đại.
Tôi muốn để lại với đề cập đến OpenMP, cho phép yo vector hóa mã bằng cách sử dụng các pragma. Tôi coi đó là một điểm khởi đầu tốt. Điều tương tự có thể được nói cho OpenACC.