C ++ Обертки для SIMD Intrinsics
SIMD (отдельная инструкция, несколько данных) является функцией микропроцессоров, которые были доступны в течение многих лет. Инструкции SIMD выполняют одну операцию на партии значений одновременно и, таким образом, предоставляют способ значительно ускорить выполнение кода. Однако эти инструкции различаются между поставщиками микропроцессоров и компиляторами.
xsimd предоставляет унифицированные средства для использования этих функций для авторов библиотеки. А именно, он позволяет манипулировать партиями чисел с теми же арифметическими операторами, что и для отдельных значений. Он также обеспечивает ускоренную реализацию общих математических функций, работающих на партиях.
Помимо Xtensor, XSIMD был принят крупными проектами с открытым исходным кодом, такими как Mozilla Firefox, Apache Arrow, Pythran и Krita.
Проект XSIMD начался с серии статей в блогах Йохана Мабилла о том, как реализовать обертки для SIMD Intrinsicts. Архивы блога можно найти здесь: ученый C ++. Дизайн, описанный в статьях, оставался близким к фактической архитектуре XSIMD до версии 8.0.
Математические функции представляют собой легкую реализацию алгоритмов, изначально реализованных в настоящее время устаревшего проекта Boost.Simd.
xsimd требует компилятора C ++ 11. Поддерживаются следующие компиляторы C ++:
| Компилятор | Версия |
|---|---|
| Microsoft Visual Studio | MSVC 2015 Обновление 2 и выше |
| G ++ | 4,9 и выше |
| герметичный | 4,0 и выше |
Поддерживаются следующие расширения набора инструкций SIMD:
| Архитектура | Увеличение набора инструкций |
|---|---|
| x86 | SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, FMA3+SSE, FMA3+AVX, FMA3+AVX2 |
| x86 | AVX512BW, AVX512CD, AVX512DQ, AVX512F (GCC7 и выше) |
| x86 Amd | FMA4 |
| РУКА | NEON, NEON64, SVE128/256/512 (фиксированный размер вектора) |
| Webassembly | Wasm |
| RISC-V | RISC-V128/256/512 (фиксированный размер вектора) |
Пакет для XSIMD доступен в менеджере пакета Mamba (или Conda).
mamba install -c conda-forge xsimdПакет для XSIMD доступен в диспетчера пакетов Spack.
spack install xsimd
spack load xsimdВы можете напрямую установить его из источников с Cmake:
cmake -D CMAKE_INSTALL_PREFIX=your_install_prefix .
make install Чтобы начать с использования xsimd , проверьте полную документацию
http://xsimd.readthedocs.io/
xsimd имеет дополнительную зависимость от библиотеки XTL:
xsimd | xtl (необязательно) |
|---|---|
| владелец | ^0,7,0 |
| 12.x | ^0,7,0 |
| 11.x | ^0,7,0 |
| 10.x. | ^0,7,0 |
| 9.x | ^0,7,0 |
| 8.x. | ^0,7,0 |
Зависимость от xtl требуется, если вы хотите поддерживать векторизацию для xtl::xcomplex . В этом случае вы должны создать свой проект с помощью поддержки C ++ 14.
Версия 8 библиотеки является полной переписыванием, и есть некоторые небольшие различия с версиями 7.x. Руководство по миграции будет доступно в ближайшее время. Между тем, следующие примеры показывают, как использовать обе версии 7 и 8 библиотеки?
Вот пример, который вычисляет среднее значение из двух наборов из 4 значений с двумя двумя плавающими точками, предполагая, что расширение AVX поддерживается:
# include < iostream >
# include " xsimd/xsimd.hpp "
namespace xs = xsimd;
int main ( int argc, char * argv[])
{
xs::batch< double , xs::avx2> a = { 1.5 , 2.5 , 3.5 , 4.5 };
xs::batch< double , xs::avx2> b = { 2.5 , 3.5 , 4.5 , 5.5 };
auto mean = (a + b) / 2 ;
std::cout << mean << std::endl;
return 0 ;
} Не забудьте включить расширение AVX при построении примера. С GCC или Clang это делается с флагом -mavx , на MSVC вы должны пройти опцию /arch:AVX .
Этот пример выводит:
( 2.0 , 3.0 , 4.0 , 5.0 )Те же вычисления, работающие на векторах и используют наиболее эффективный набор инструкций:
# include < cstddef >
# include < vector >
# include " xsimd/xsimd.hpp "
namespace xs = xsimd;
using vector_type = std::vector< double , xsimd::aligned_allocator< double >>;
void mean ( const vector_type& a, const vector_type& b, vector_type& res)
{
std:: size_t size = a. size ();
constexpr std:: size_t simd_size = xsimd::simd_type< double >::size;
std:: size_t vec_size = size - size % simd_size;
for (std:: size_t i = 0 ; i < vec_size; i += simd_size)
{
auto ba = xs::load_aligned (&a[i]);
auto bb = xs::load_aligned (&b[i]);
auto bres = (ba + bb) / 2 .;
bres. store_aligned (&res[i]);
}
for (std:: size_t i = vec_size; i < size; ++i)
{
res[i] = (a[i] + b[i]) / 2 .;
}
}Создание испытаний требует Cmake.
cmake доступен в качестве пакета для большинства распределений Linux. Кроме того, они также могут быть установлены с помощью диспетчера пакетов conda (даже в Windows):
conda install -c conda-forge cmake После установки cmake вы можете построить и запустить тесты:
mkdir build
cd build
cmake ../ -DBUILD_TESTS=ON
make xtest В контексте непрерывной интеграции с Travis CI тесты проводятся в среде conda , которая может быть активирована с помощью
cd test
conda env create -f ./test-environment.yml
source activate test-xsimd
cd ..
cmake . -DBUILD_TESTS=ON
make xtestДокументация XSIMD построена с тремя инструментами
В то время как доксиген должен быть установлен отдельно, вы можете установить дыхание, вводя в печати
pip install breathe Дыхание также можно установить с conda
conda install -c conda-forge breatheНаконец, создайте документацию с
make html от docs подкаканал.
Мы используем общую модель авторского права, которая позволяет всем участникам сохранять авторские права на их взносы.
Это программное обеспечение лицензировано по лицензии BSD-3-CLAUSE. Смотрите файл лицензии для получения подробной информации.