2016-11-24 12 views
1

처리 속도 향상을위한 병렬 처리 알고리즘을 살펴 봅니다. Agner Fog's vector class library, VCL을 테스트하고 싶습니다.처리 속도를위한 벡터 클래스 라이브러리

Vec16c (SSE2 명령어 세트) 및 Vec32c (AVX 명령어 세트)과 같은 다른 벡터 클래스를 선택하는 방법이 궁금합니다.

인텔 ® 아톰 ™ x5-Z8350 프로세서를 사용하고 있으며 사양에 따라 SSE4.2 명령어 세트를 지원합니다.

하드웨어 지원과 관련하여 벡터 클래스를 효과적으로 선택하려면 어떻게해야합니까? 내 프로세서를 위해 AVX 명령어 세트에 권장되는 Vec32c를 사용할 수 있습니까?

답변

3
당신과 같은, 당신이 컴파일하고 목표를 사용할 수있는 것을 명령어 세트를 감지하는 컴파일러 정의 된 매크로를 사용할 수 있습니다

:

// Assume SSE2 as a baseline 
#include <vectori128.h> 

#if defined(__AVX2__) 
#include <vectori256.h> 
using vector_type = Vec32c; 
#else 
// Vec16c uses whatever is enabled, so you don't have to check for SSE4 yourself 
using vector_type = Vec16c; 
#endif 

것은이 런타임 감지 할, 그래서만을 사용하지 않는다 AVX2가있는 CPU에서만 실행되는 바이너리를 만들려면 AVX2를 선택하십시오.

VCL이 전혀 지원되지 않는 x86 플랫폼이 아닌 x86 또는 SSE2가없는 x86을 작동 시키려면 #include <vectori128.h>#if으로 보호해야합니다.

+0

'__AVX2__'가 정의되어 있고, 그렇지 않으면 항상'Vec16c'을 사용합니다 (벡터 클래스 헤더가 유용 할 때 SSE4.1/4.2/SSSE3을 사용하게합니다). 코드에서 매크로로 할 수있는 유일한 방법은 다음과 같습니다. AVX512를 확인하고'Vec64c '를 사용하십시오. vectorclass 라이브러리의 주요 목표 중 하나는 다양한 대상 옵션의 가용성을 기반으로 다양한 내장 함수를 추상화하는 것입니다. –

+0

내가 upvote 수 있기 전에 이것은 꽤 중요한 편집을했다,하지만 나는 지금 그것이 옳다는 것을 꽤 확신한다. 실제로 VCL (및 기여한 변경 사항) (https://github.com/pcordes/vectorclass) (AFAIK는 아직 통합되지 않았으므로 Agner가 포함 할 수 있도록 정리해야합니다.)) –

2

32 바이트 벡터에는 AVX가 필요합니다. (Vec32c과 같은 32B 정수 벡터의 경우 AVX2). Atom에는 AVX가 없으므로 Agner의 vectorclassi256.h 또는 vectorclassf256.h은 포함하지 말고 128 헤더 만 포함하십시오.

-march=native으로 컴파일하면 호스트 CPU가 지원하는 모든 명령어 세트를 컴파일러에서 사용할 수 있습니다.

Vec16c 함수의 구현은 VectorClass가 매크로를 검사하여 활성화되어 있는지 확인하기 때문에 자동으로 SSE4.2 내장 함수를 사용합니다. 따라서 Vec16c을 사용하면 타겟이 지원하는 모든 기능을 가장 잘 구현할 수 있습니다.

는 (컴파일 타임 CPU/대상 옵션을하고있는 때문에 이것은 사실이다. 당신이 자신을 파견 런타임을하고 싶었다 경우 어렵게 될 것입니다.) 당신은 실제로 경우 Vec32c을 사용할 것