Vc sekarang dalam mode pemeliharaan dan tidak lagi dikembangkan secara aktif. Namun, kami terus meninjau permintaan penarikan dengan perbaikan bug dari komunitas.
Anda mungkin tertarik untuk beralih ke std-simd. GCC 11 menyertakan versi eksperimental std::simd
sebagai bagian dari libstdc++, yang juga berfungsi dengan dentang. Fitur yang ada di Vc 1.4 dan tidak ada di std-simd pada akhirnya akan berubah menjadi Vc 2.0, yang kemudian bergantung pada std-simd .
CPU generasi terbaru, dan khususnya GPU, memerlukan kode paralel data untuk efisiensi penuh. Paralelisme data mengharuskan urutan operasi yang sama diterapkan pada data masukan yang berbeda. CPU dan GPU dengan demikian dapat mengurangi perangkat keras yang diperlukan untuk decoding dan penjadwalan instruksi demi lebih banyak unit aritmatika dan logika, yang mengeksekusi instruksi yang sama secara sinkron. Pada arsitektur CPU, hal ini diimplementasikan melalui register dan instruksi SIMD. Sebuah register SIMD tunggal dapat menyimpan N nilai dan satu instruksi SIMD dapat mengeksekusi N operasi pada nilai tersebut. Pada arsitektur GPU, N thread berjalan dalam sinkronisasi sempurna, diumpankan oleh dekoder/penjadwal instruksi tunggal. Setiap thread memiliki memori lokal dan indeks tertentu untuk menghitung offset dalam memori untuk memuat dan menyimpan.
Kompiler C++ saat ini dapat melakukan transformasi otomatis kode skalar ke instruksi SIMD (vektorisasi otomatis). Namun, kompiler harus merekonstruksi properti intrinsik dari algoritma yang hilang ketika pengembang menulis implementasi skalar murni di C++. Akibatnya, kompiler C++ tidak dapat melakukan vektorisasi kode tertentu ke varian paralel data yang paling efisien. Terutama loop data-paralel yang lebih besar, yang mencakup beberapa fungsi atau bahkan unit terjemahan, sering kali tidak diubah menjadi kode SIMD yang efisien.
Perpustakaan Vc menyediakan tautan yang hilang. Tipenya memungkinkan pernyataan operasi paralel data secara eksplisit pada beberapa nilai. Oleh karena itu paralelisme ditambahkan melalui sistem tipe. Pendekatan yang bersaing menyatakan paralelisme melalui struktur kontrol baru dan akibatnya semantik baru di dalam tubuh struktur kontrol ini.
Vc adalah perpustakaan perangkat lunak gratis untuk memudahkan vektorisasi eksplisit kode C++. Ia memiliki API yang intuitif dan menyediakan portabilitas antara berbagai kompiler dan versi kompiler serta portabilitas antara set instruksi vektor yang berbeda. Dengan demikian aplikasi yang ditulis dengan Vc dapat dikompilasi untuk:
Setelah Intel menghentikan dukungan MIC dengan ICC 18, Vc 1.4 juga menghapus dukungan untuk itu.
std::vector<Particle>
simdize
d pada banyak std::vector<float>
. Perhatikan betapa pentingnya flag -march
, dibandingkan dengan -mavx2 -mfma
biasa.Mari kita mulai dari kode untuk menghitung produk skalar 3D menggunakan float bawaan:
using Vec3D = std::array< float , 3 >;
float scalar_product (Vec3D a, Vec3D b) {
return a[ 0 ] * b[ 0 ] + a[ 1 ] * b[ 1 ] + a[ 2 ] * b[ 2 ];
}
Dengan menggunakan Vc, kita dapat dengan mudah membuat vektorisasi kode menggunakan tipe float_v
:
using Vc::float_v
using Vec3D = std::array<float_v, 3 >;
float_v scalar_product (Vec3D a, Vec3D b) {
return a[ 0 ] * b[ 0 ] + a[ 1 ] * b[ 1 ] + a[ 2 ] * b[ 2 ];
}
Di atas akan berskala menjadi 1, 4, 8, 16, dst. Produk skalar dihitung secara paralel, bergantung pada kemampuan perangkat keras target.
Sebagai perbandingan, vektorisasi yang sama menggunakan intrinsik Intel SSE lebih bertele-tele dan menggunakan notasi awalan (yaitu pemanggilan fungsi):
using Vec3D = std::array<__m128, 3 >;
__m128 scalar_product (Vec3D a, Vec3D b) {
return _mm_add_ps ( _mm_add_ps ( _mm_mul_ps (a[ 0 ], b[ 0 ]), _mm_mul_ps (a[ 1 ], b[ 1 ])),
_mm_mul_ps (a[ 2 ], b[ 2 ]));
}
Hal di atas tidak akan berskala ke AVX, AVX-512, dll. Juga tidak portabel untuk ISA SIMD lainnya.
buat >= 3.0
Kompiler C++11:
git clone https://github.com/VcDevel/Vc.git
cd Vc
git submodule update --init
$ mkdir build
$ cd build
$ cmake ..
Secara opsional, tentukan direktori instalasi:
$ cmake -DCMAKE_INSTALL_PREFIX=/opt/Vc ..
Secara opsional, sertakan pembuatan pengujian unit:
$ cmake -DBUILD_TESTING=ON ..
Di Windows, jika Anda menginstal beberapa versi Visual Studio, Anda dapat memilih salah satu:
$ cmake -G " Visual Studio 16 2019 " ..
Lihat cmake --help
untuk daftar kemungkinan generator.
$ cmake --build . -j 16
$ cmake --install . # may require permissions
Di Windows, Anda juga dapat membuka Vc.sln
di Visual Studio dan membangun/menginstal dari IDE.
Dokumentasi dihasilkan melalui doxygen. Anda dapat membuat dokumentasi dengan menjalankan doxygen
di subdirektori doc
. Atau, Anda dapat menemukan dokumentasi versi malam di:
Bekerja untuk mengintegrasikan fungsionalitas Vc di perpustakaan standar C++.
Vc dirilis berdasarkan ketentuan lisensi 3-klausul BSD.