인텔 컴파일러는
_mm512_reduce_add_ps //horizontal sum of 16 floats
_mm512_reduce_add_pd //horizontal sum of 8 doubles
_mm512_reduce_add_epi32 //horizontal sum of 16 32-bit integers
_mm512_reduce_add_epi64 //horizontal sum of 8 64-bit integers
그러나, 지금까지의 나는 당신이하고있는 것보다 더 많은 것을 얻을 수 있다고 생각하지 않도록 어쨌든 여러 지침으로 나누어 이들을 말할 수있는 다음과 같은 고유 할 정의 수평 금액을 가지고 AVX512 레지스터의 상단과 하단의 수평 합.
__m256 low = _mm512_castps512_ps256(zmm);
__m256 high = _mm256_castpd_ps(_mm512_extractf64x4_pd(_mm512_castps_pd(zmm),1));
__m256d low = _mm512_castpd512_pd256(zmm);
__m256d high = _mm512_extractf64x4_pd(zmm,1);
__m256i low = _mm512_castsi512_si256(zmm);
__m256i high = _mm512_extracti64x4_epi64(zmm,1);
가로 합계를 얻으려면 sum = horizontal_add(low + high)
을 입력하십시오.
static inline float horizontal_add (__m256 a) {
__m256 t1 = _mm256_hadd_ps(a,a);
__m256 t2 = _mm256_hadd_ps(t1,t1);
__m128 t3 = _mm256_extractf128_ps(t2,1);
__m128 t4 = _mm_add_ss(_mm256_castps256_ps128(t2),t3);
return _mm_cvtss_f32(t4);
}
static inline double horizontal_add (__m256d a) {
__m256d t1 = _mm256_hadd_pd(a,a);
__m128d t2 = _mm256_extractf128_pd(t1,1);
__m128d t3 = _mm_add_sd(_mm256_castpd256_pd128(t1),t2);
return _mm_cvtsd_f64(t3);
}
나는
Agner Fog's Vector Class Library과
Intel Instrinsics Guide online에서 모든 정보와 기능을 얻었다.
무엇 정확하게 수평으로하려고 노력하고 있습니다 조작? 대규모 감축 작업이 끝나면 성능에 심각한 영향을 미치지 않을 것입니다. (그럼에도 불구하고,'_mm512_reduce_add_ps'는 그 목적을 위해 존재하며 셔플과 합계의 바이너리 감소로 컴파일됩니다.) – Mysticial
AVX-512는 표준에서 벗어난 것처럼 보였으므로이 사실을 알지 못합니다. 너비 "향상. 작업은 이미 128 비트 또는 256 비트 uops로 축소되어 있으므로 수평 명령은 아직 많은 의미가 없습니다. –
@CoryNelson 더 나쁘게하려면 수평 명령어가 기존 프로세서에 마이크로 코드됩니다. 그래서 그들은 이미 느립니다. 또한 수평 벡터화 작업은 SIMD 패러다임을 위반하고 확장되지 않습니다. – Mysticial