2016-07-07 1 views
1

float4/double4 구조체의 AVX-256/512 코드에서 기본 작동 *, +, /, -을 벡터 오버로드하여 벡터에서 빠른 성능 향상을 얻으려는 스칼라 등의 배율을 찾고 있습니다. float4/double4를 사용하여 작성된 코드에서의 연산. OpenCL은 이러한 데이터 유형을 intrinsics로 가지고 있지만 XeonPhi에서 실행되는 C++ 코드는 512 비트 SIMD 단위를 활용하는 새로운 구현이 필요합니다.AVX float4/double4 struct

+1

주제를 벗어나서 불충분 함. SIMD 벡터를 벡터로 사용하는 것은 때로는 합리적이지만 아주 자주는 좋지 않은 아이디어입니다. 즉, 점 제품과 정규화를 고려하면 가로로 수행하면 비효율적입니다. 추가는 물론 괜찮습니다. 따라서 벡터에서 수행 할 작업에 따라 다릅니다. – harold

+0

나는이 방법으로 도트 제품이 나쁘다는 것을 알고있다. 원하는 작업은 *, +, /, -, + =, - =,/=, * =, mulitply 및 스칼라로 나누기 – user1382302

+1

그럼 괜찮습니다. 물론, 실제로 512 비트 SIMD를 사용하지는 않을 것입니다. 4 개의 double은 결국 256 비트입니다. – harold

답변

1

찾으시는 분은 Agner Fog 님의 Vector Class Library(VCL)입니다. 나는 이것을 주로 OpenCL에서 벡터 유형을 대체하는 데 사용했습니다.

VCL float4Vec4f이고 double4Vec4d입니다. OpenCL처럼 AVX와 AVX512에 대해 걱정할 필요가 없습니다. Vec8d을 사용하고 AVX 용으로 컴파일하면 두 개의 AVX 레지스터를 사용하여 AVX512를 에뮬레이션합니다.

VCL에는 원하는 모든 작업 (예 : *,+,/,-,+=,-=,/=,*=, multiply and divide by scalar)이 있으며 더 많은 기능이 있습니다.

OpenCL과 VCL의 주된 차이점은 OpenCL은 기본적으로 CPU 디스패처를 만듭니다. 반면 VCL에서는 CPU 디스패처를 직접 작성해야합니다 (설명서와 함께이 작업을 수행하는 데 필요한 몇 가지 예제 코드가 포함되어 있습니다). VCL은 SSE2에서 AVX512까지의 기능을 최적화하여 여러 명령어 세트를 대상으로 할 수 있습니다. Knights Corner Xeon Phi는 a special version of the VCL입니다.

내가 놓친 OpenCL의 또 다른 기능은 치환을위한 구문입니다. OpenCL에서 float4의 구성 요소의 순서를 반대로하려면 v.wzyx을 수행 할 수 있지만 VCL에서는 permute4f<3,2,1,0>(v)을 수행 할 수 있습니다. create this syntax with C++ 일 수도 있지만 확실하지 않습니다.

VCL, OpenMP 및 사용자 지정 CPU 디스패처를 사용하여 CPU에서 OpenCL을 대체했습니다.