Vektorisasi, dengan kata sederhana, berarti mengoptimalkan algoritme sehingga dapat memanfaatkan instruksi SIMD dalam prosesor.
AVX, AVX2 dan AVX512 adalah set instruksi (intel) yang melakukan operasi yang sama pada banyak data dalam satu instruksi. untuk mis. AVX512 berarti Anda dapat beroperasi pada 16 nilai integer (4 byte) sekaligus. Apa itu artinya adalah jika Anda memiliki vektor 16 bilangan bulat dan Anda ingin menggandakan nilai itu di setiap bilangan bulat dan kemudian menambahkan 10 untuk itu. Anda dapat memuat nilai ke register umum [a, b, c] 16 kali dan melakukan operasi yang sama atau Anda dapat melakukan operasi yang sama dengan memuat semua 16 nilai ke register SIMD [xmm, ymm] dan melakukan operasi sekali. Ini memungkinkan mempercepat perhitungan data vektor.
Dalam vektorisasi kami menggunakan ini untuk keuntungan kami, dengan memperbarui data kami sehingga kami dapat melakukan operasi SIMD dan mempercepat program.
Satu-satunya masalah dengan vektorisasi adalah penanganan kondisi. Karena kondisi bercabang aliran eksekusi. Ini bisa ditangani dengan menutupi. Dengan memodelkan kondisi tersebut ke dalam operasi aritmatika. misalnya. jika kita ingin menambahkan 10 ke nilai jika lebih besar dari 100. kita juga bisa.
if(x[i] > 100) x[i] += 10; // this will branch execution flow.
atau kita dapat memodelkan kondisi ke dalam operasi aritmatika menciptakan vektor kondisi c,
c[i] = x[i] > 100; // storing the condition on masking vector
x[i] = x[i] + (c[i] & 10) // using mask
ini adalah contoh yang sangat sepele ... jadi, c adalah vektor masking kami yang kami gunakan untuk melakukan operasi biner berdasarkan nilainya. Ini menghindari percabangan aliran eksekusi dan memungkinkan vektorisasi.
Vektorisasi sama pentingnya dengan Paralelisasi. Jadi, kita harus memanfaatkannya sebanyak mungkin. Semua prosesor modern memiliki instruksi SIMD untuk beban kerja komputasi yang berat. Kita dapat mengoptimalkan kode kita untuk menggunakan instruksi SIMD ini menggunakan vektorisasi, ini mirip dengan memparalelkan kode kita untuk berjalan pada banyak core yang tersedia pada prosesor modern.
Saya ingin meninggalkan dengan menyebutkan OpenMP, yang memungkinkan Anda mengubah kode menggunakan pragma. Saya menganggapnya sebagai titik awal yang baik. Hal yang sama dapat dikatakan untuk OpenACC.