Vc сейчас находится в режиме обслуживания и больше не разрабатывается активно. Тем не менее, мы продолжаем рассматривать запросы на внесение исправлений от сообщества.
Возможно, вас заинтересует переход на std-simd. GCC 11 включает экспериментальную версию std::simd
как часть libstdc++, которая также работает с clang. Функции, присутствующие в Vc 1.4 и отсутствующие в std-simd, в конечном итоге превратятся в Vc 2.0, который затем будет зависеть от std-simd .
Последние поколения процессоров и, в частности, графических процессоров требуют кодов с параллельными данными для обеспечения полной эффективности. Параллелизм данных требует, чтобы одна и та же последовательность операций применялась к различным входным данным. Таким образом, центральные и графические процессоры могут уменьшить необходимое оборудование для декодирования и планирования инструкций в пользу большего количества арифметических и логических блоков, которые выполняют одни и те же инструкции синхронно. В архитектурах ЦП это реализуется через регистры и инструкции SIMD. Один регистр SIMD может хранить N значений, а одна инструкция SIMD может выполнять N операций над этими значениями. В архитектурах графических процессоров N потоков выполняются идеально синхронно, обслуживаемые одним декодером/планировщиком инструкций. Каждый поток имеет локальную память и заданный индекс для расчета смещений в памяти для загрузки и сохранения.
Современные компиляторы C++ могут выполнять автоматическое преобразование скалярных кодов в инструкции SIMD (автовекторизация). Однако компилятор должен восстановить внутреннее свойство алгоритма, которое было потеряно, когда разработчик написал чисто скалярную реализацию на C++. Следовательно, компиляторы C++ не могут векторизовать какой-либо код до его наиболее эффективного варианта с параллельными данными. Особенно большие циклы параллельных данных, охватывающие несколько функций или даже единиц трансляции, часто не преобразуются в эффективный SIMD-код.
Библиотека Vc предоставляет недостающее звено. Его типы позволяют явно указывать параллельные операции с данными над несколькими значениями. Таким образом, параллелизм добавляется через систему типов. Конкурирующие подходы утверждают параллелизм посредством новых структур управления и, следовательно, новой семантики внутри тела этих структур управления.
Vc — это бесплатная библиотека программного обеспечения, упрощающая явную векторизацию кода C++. Он имеет интуитивно понятный API и обеспечивает переносимость между различными компиляторами и версиями компиляторов, а также между различными наборами векторных инструкций. Таким образом, приложение, написанное на Vc, можно скомпилировать для:
После того, как Intel отказалась от поддержки MIC в ICC 18, Vc 1.4 также удалил ее поддержку.
std::vector<Particle>
simdize
d для многих std::vector<float>
. Обратите внимание, насколько важен флаг -march
по сравнению с простым -mavx2 -mfma
.Начнем с кода расчета 3D-скалярного произведения с использованием встроенных чисел с плавающей запятой:
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 ];
}
Используя Vc, мы можем легко векторизовать код, используя тип 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 ];
}
Вышеупомянутое будет масштабироваться до 1, 4, 8, 16 и т. д. скалярных произведений, вычисляемых параллельно, в зависимости от возможностей целевого оборудования.
Для сравнения, та же векторизация с использованием встроенных функций Intel SSE является более подробной и использует префиксную нотацию (т. е. вызовы функций):
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 ]));
}
Вышеупомянутое не масштабируется до AVX, AVX-512 и т. д. и не переносимо на другие SIMD ISA.
cmake >= 3.0
Компилятор С++11:
git clone https://github.com/VcDevel/Vc.git
cd Vc
git submodule update --init
$ mkdir build
$ cd build
$ cmake ..
При желании укажите каталог установки:
$ cmake -DCMAKE_INSTALL_PREFIX=/opt/Vc ..
При желании включите создание модульных тестов:
$ cmake -DBUILD_TESTING=ON ..
В Windows, если у вас установлено несколько версий Visual Studio, вы можете выбрать одну:
$ cmake -G " Visual Studio 16 2019 " ..
См. cmake --help
для получения списка возможных генераторов.
$ cmake --build . -j 16
$ cmake --install . # may require permissions
В Windows вы также можете открыть Vc.sln
в Visual Studio и выполнить сборку/установку из IDE.
Документация генерируется с помощью doxygen. Вы можете создать документацию, запустив doxygen
в подкаталоге doc
. Кроме того, вы можете найти ночные сборки документации по адресу:
Работа над интеграцией функциональности Vc в стандартную библиотеку C++.
Vc выпускается на условиях лицензии BSD из 3 пунктов.