Simd Intrinsics를위한 C ++ 포장지
SIMD (단일 명령, 다중 데이터)는 수년 동안 사용할 수있는 마이크로 프로세서의 기능입니다. SIMD 명령어는 한 번에 값의 배치에서 단일 작업을 수행하므로 코드 실행을 크게 가속화하는 방법을 제공합니다. 그러나 이러한 지침은 마이크로 프로세서 공급 업체와 컴파일러간에 다릅니다.
xsimd 라이브러리 저자에게 이러한 기능을 사용하기위한 통일 된 수단을 제공합니다. 즉, 단일 값과 동일한 산술 연산자가있는 숫자 배치를 조작 할 수 있습니다. 또한 배치에서 작동하는 일반적인 수학적 기능의 가속 구현을 제공합니다.
XSIMD는 Xtensor를 넘어 Mozilla Firefox, Apache Arrow, Pythran 및 Krita와 같은 주요 오픈 소스 프로젝트에 의해 채택되었습니다.
XSIMD 프로젝트는 Johan Mabille의 Simd Intrinsicts를위한 포장지를 구현하는 방법에 대한 일련의 블로그 기사로 시작했습니다. 블로그의 아카이브는 여기에서 찾을 수 있습니다 : C ++ 과학자. 기사에 설명 된 디자인은 버전 8.0까지 XSIMD의 실제 아키텍처에 가깝게 유지되었습니다.
수학적 함수는 원래 현재 더 이상 사용되지 않은 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 xsimdXSIMD 용 패키지는 스팩 패키지 관리자에서 제공됩니다.
spack install xsimd
spack load xsimdcmake가있는 소스에서 직접 설치할 수 있습니다.
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::xcomplex 의 벡터화를 지원하려면 xtl 에 대한 종속성이 필요합니다. 이 경우 C ++ 14 지원이 활성화 된 프로젝트를 구축해야합니다.
라이브러리의 버전 8은 완전한 재 작성이며 7.x 버전에는 약간의 차이가 있습니다. 마이그레이션 가이드가 곧 제공 될 예정입니다. 한편, 다음 예제는 라이브러리의 버전 7과 8을 모두 사용하는 방법을 보여줍니다.
다음은 AVX 확장이 지원되었다고 가정 할 때 4 개의 이중 플로팅 포인트 값의 두 세트의 평균을 계산하는 예입니다.
# 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 xtestXSIMD의 문서는 세 가지 도구로 구축되었습니다
Doxygen을 별도로 설치해야하지만 입력하여 호흡을 설치할 수 있습니다.
pip install breathe 호흡은 conda 로 설치할 수도 있습니다
conda install -c conda-forge breathe마지막으로 문서를 작성하십시오
make html docs 서브 디렉토리에서.
우리는 모든 기고자가 기여에 대한 저작권을 유지할 수있는 공유 저작권 모델을 사용합니다.
이 소프트웨어는 BSD-3-Clause 라이센스에 따라 라이센스가 부여됩니다. 자세한 내용은 라이센스 파일을 참조하십시오.