Vc는 이제 유지 관리 모드에 있으며 더 이상 적극적으로 개발되지 않습니다. 그러나 우리는 커뮤니티의 버그 수정이 포함된 풀 요청을 계속 검토하고 있습니다.
std-simd로 전환하는 데 관심이 있을 수 있습니다. GCC 11에는 clang에서도 작동하는 libstdc++의 일부로 std::simd
의 실험적 버전이 포함되어 있습니다. Vc 1.4에는 있고 std-simd 에는 없는 기능은 결국 Vc 2.0으로 바뀌게 되며, 이는 std-simd 에 따라 달라집니다.
최신 세대의 CPU, 특히 GPU에서는 완전한 효율성을 위해 데이터 병렬 코드가 필요합니다. 데이터 병렬성을 위해서는 동일한 작업 순서가 서로 다른 입력 데이터에 적용되어야 합니다. 따라서 CPU와 GPU는 동일한 명령을 동기적으로 실행하는 더 많은 산술 및 논리 장치를 선호하여 명령 디코딩 및 스케줄링에 필요한 하드웨어를 줄일 수 있습니다. CPU 아키텍처에서는 SIMD 레지스터와 명령어를 통해 구현됩니다. 단일 SIMD 레지스터는 N 값을 저장할 수 있으며 단일 SIMD 명령어는 해당 값에 대해 N 작업을 실행할 수 있습니다. GPU 아키텍처에서는 N 스레드가 단일 명령어 디코더/스케줄러에 의해 공급되어 완벽한 동기화로 실행됩니다. 각 스레드에는 로컬 메모리와 로드 및 저장을 위한 메모리의 오프셋을 계산하기 위한 지정된 인덱스가 있습니다.
현재 C++ 컴파일러는 스칼라 코드를 SIMD 명령으로 자동 변환(자동 벡터화)할 수 있습니다. 그러나 컴파일러는 개발자가 C++에서 순수 스칼라 구현을 작성할 때 손실된 알고리즘의 고유 속성을 재구성해야 합니다. 결과적으로 C++ 컴파일러는 주어진 코드를 가장 효율적인 데이터 병렬 변형으로 벡터화할 수 없습니다. 특히 여러 기능이나 변환 단위에 걸쳐 있는 더 큰 데이터 병렬 루프는 효율적인 SIMD 코드로 변환되지 않는 경우가 많습니다.
Vc 라이브러리는 누락된 링크를 제공합니다. 해당 유형을 사용하면 여러 값에 대해 데이터 병렬 작업을 명시적으로 지정할 수 있습니다. 따라서 병렬성은 유형 시스템을 통해 추가됩니다. 경쟁적인 접근 방식에서는 새로운 제어 구조를 통한 병렬성과 결과적으로 이러한 제어 구조 본체 내부의 새로운 의미론이 명시됩니다.
Vc는 C++ 코드의 명시적 벡터화를 쉽게 해주는 무료 소프트웨어 라이브러리입니다. 이는 직관적인 API를 갖추고 있으며 다양한 컴파일러와 컴파일러 버전 간의 이식성과 다양한 벡터 명령어 세트 간의 이식성을 제공합니다. 따라서 Vc로 작성된 애플리케이션은 다음을 위해 컴파일될 수 있습니다.
Intel이 ICC 18에서 MIC 지원을 중단한 후 Vc 1.4에서도 이에 대한 지원을 제거했습니다.
std::vector<Particle>
의 총 운동량 및 시간 단계std::vector<float>
에 대한 시뮬레이션 계산 simdize
보여주는 N-vortex 솔버. 일반 -mavx2 -mfma
와 비교하여 -march
플래그가 얼마나 중요한지 확인하세요.내장 부동 소수점을 사용하여 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
C++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에서는 Visual Studio에서 Vc.sln
열고 IDE에서 빌드/설치할 수도 있습니다.
문서는 doxygen을 통해 생성됩니다. doc
하위 디렉터리에서 doxygen
실행하여 문서를 작성할 수 있습니다. 또는 다음 위치에서 야간 문서 빌드를 찾을 수 있습니다.
C++ 표준 라이브러리에 Vc 기능을 통합하는 작업을 수행합니다.
Vc는 3절 BSD 라이센스 조건에 따라 릴리스됩니다.