Beberapa kali sekarang, saya telah menemukan istilah ini di matlab, fortran ... beberapa lainnya ... tapi saya belum pernah menemukan penjelasan apa artinya, dan apa artinya? Jadi saya bertanya di sini, apa itu vektorisasi, dan apa artinya misalnya, bahwa "sebuah loop di-vektor-kan"?
vectorization
Thomas Geritzma
sumber
sumber
Jawaban:
Banyak CPU memiliki set instruksi "vektor" atau "SIMD" yang menerapkan operasi yang sama secara bersamaan untuk dua, empat, atau lebih banyak data. Chip x86 modern memiliki instruksi SSE, banyak chip PPC memiliki instruksi "Altivec", dan bahkan beberapa chip ARM memiliki set instruksi vektor, yang disebut NEON.
"Vektorisasi" (disederhanakan) adalah proses penulisan ulang sebuah loop sehingga alih-alih memproses elemen tunggal dari array N kali, ia memproses (katakanlah) 4 elemen array secara bersamaan N / 4 kali.
(Saya memilih 4 karena itulah yang paling mungkin didukung oleh perangkat keras modern; istilah "vektorisasi" juga digunakan untuk menggambarkan transformasi perangkat lunak tingkat lebih tinggi di mana Anda dapat memisahkan abstrak dari loop secara bersamaan dan hanya menjelaskan pengoperasian pada array daripada elemen-elemennya). yang terdiri dari mereka)
Perbedaan antara vektorisasi dan loop terbuka: Pertimbangkan loop sangat sederhana berikut yang menambahkan elemen dari dua array dan menyimpan hasilnya ke array ketiga.
Membuka gulungan lingkaran ini akan mengubahnya menjadi seperti ini:
Vektorisasi, di sisi lain, menghasilkan sesuatu seperti ini:
Di mana "addFourThingsAtOnceAndStoreResult" adalah placeholder untuk intrinsik apa pun yang digunakan kompiler Anda untuk menentukan instruksi vektor. Perhatikan bahwa beberapa kompiler dapat melakukan autoisasi vektor loop yang sangat sederhana seperti ini, yang seringkali dapat diaktifkan melalui opsi kompilasi. Algoritma yang lebih kompleks masih membutuhkan bantuan dari programmer untuk menghasilkan kode vektor yang baik.
sumber
Vektorisasi adalah istilah untuk mengubah program skalar menjadi program vektor. Program vektor dapat menjalankan beberapa operasi dari satu instruksi, sedangkan skalar hanya dapat beroperasi pada pasangan operan sekaligus.
Dari wikipedia :
Pendekatan skalar:
Pendekatan vektor:
sumber
Ini mengacu pada kemampuan untuk melakukan operasi matematika tunggal pada daftar - atau "vektor" - angka dalam satu langkah. Anda sering melihatnya dengan Fortran karena itu terkait dengan komputasi ilmiah, yang dikaitkan dengan superkomputer, di mana aritmatika vektor muncul pertama kali. Saat ini hampir semua CPU desktop menawarkan beberapa bentuk aritmatika vektor, melalui teknologi seperti Intel SSE. GPU juga menawarkan bentuk aritmatika vektor.
sumber
Vektorisasi sangat banyak digunakan dalam komputasi ilmiah di mana sejumlah besar data perlu diproses secara efisien.
Dalam aplikasi pemrograman nyata, saya tahu itu digunakan dalam NUMPY (tidak yakin yang lain).
Numpy (paket untuk komputasi ilmiah dalam python), menggunakan vektorisasi untuk manipulasi cepat array n-dimensi, yang umumnya lebih lambat jika dilakukan dengan opsi python bawaan untuk menangani array.
meskipun ada banyak penjelasan, DI SINI ADA VEKTORISASI YANG DITETAPKAN SEBAGAI DALAM HALAMAN DOKUMENTASI NUMPY
Vektorisasi menjelaskan tidak adanya perulangan eksplisit, pengindeksan, dll., Dalam kode - hal-hal ini terjadi, tentu saja, "di belakang layar" dalam kode C yang dioptimalkan, yang telah dikompilasi sebelumnya. Kode vektor memiliki banyak keunggulan, di antaranya adalah:
kode vektor lebih ringkas dan lebih mudah dibaca
lebih sedikit baris kode umumnya berarti lebih sedikit bug
kode lebih menyerupai notasi matematika standar (membuatnya lebih mudah, biasanya, dengan benar mengkodekan konstruksi matematika)
hasil vektorisasi lebih banyak kode "Pythonic". Tanpa vektorisasi, kode kita akan dikotori dengan tidak efisien dan sulit dibaca untuk loop.
sumber
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.
atau kita dapat memodelkan kondisi ke dalam operasi aritmatika menciptakan vektor kondisi c,
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.
sumber
Menurut orang Intel, saya pikir ini mudah dipahami.
Tautan https://software.intel.com/en-us/articles/vectorization-a-key-tool-to-improve-performance-on-modern-cpus
Di Jawa ada opsi untuk ini dimasukkan dalam Jdk 15 tahun 2020 atau terlambat di JDK 16 pada 2021.
https://bugs.openjdk.java.net/browse/JDK-8201271
sumber
Lihat dua jawaban di atas. Saya hanya ingin menambahkan bahwa alasan ingin melakukan vektorisasi adalah bahwa operasi ini dapat dengan mudah dilakukan di paraell oleh superkomputer dan multi-prosesor, menghasilkan keuntungan kinerja yang besar. Pada komputer prosesor tunggal tidak akan ada peningkatan kinerja.
sumber