인텔 프로세서의 SIMD 접두사 합계
소개
접두사 합계 알고리즘은 누적 합계를 찾습니다. 주어진 배열의. 이 작업은 다양한 계산 문제에서 발생하며 효율적인 처리를 위해 높은 성능이 필요합니다. 이 기사에서는 Intel CPU의 SIMD 명령어가 접두사 합 알고리즘의 성능을 향상시킬 수 있는지 여부를 다룹니다.
SIMD를 사용한 병렬 접두사 합
하나의 병렬 접두사 합 알고리즘 두 단계로 작업을 수행하는 작업이 포함됩니다. 첫 번째 단계에서는 부분합이 병렬로 계산된 후 각 부분합에 대한 총합이 누적됩니다. 두 번째 패스에서는 각 부분합의 총합을 다음 부분합에 더합니다. 병렬 처리를 위해 OpenMP를 통해 다중 스레드를 사용하고 두 번째 패스에 SIMD 명령을 사용하면 효율성이 향상될 수 있습니다.
SIMD 접두사 합계 코드
다음은 ~ 위에 알고리즘:
__m128 scan_SSE(__m128 x) { x = _mm_add_ps(x, _mm_castsi128_ps(_mm_slli_si128(_mm_castps_si128(x), 4))); x = _mm_add_ps(x, _mm_shuffle_ps(_mm_setzero_ps(), x, 0x40)); return x; } void pass1_SSE(float *a, float *s, const int n) { __m128 offset = _mm_setzero_ps(); #pragma omp for schedule(static) nowait for (int i = 0; i < n / 4; i++) { __m128 x = _mm_load_ps(&a[4 * i]); __m128 out = scan_SSE(x); out = _mm_add_ps(out, offset); _mm_store_ps(&s[4 * i], out); offset = _mm_shuffle_ps(out, out, _MM_SHUFFLE(3, 3, 3, 3)); } float tmp[4]; _mm_store_ps(tmp, offset); return tmp[3]; } void pass2_SSE(float *s, __m128 offset, const int n) { #pragma omp for schedule(static) for (int i = 0; i<n/4; i++) { __m128 tmp1 = _mm_load_ps(&s[4 * i]); tmp1 = _mm_add_ps(tmp1, offset); _mm_store_ps(&s[4 * i], tmp1); } }
토론
이러한 최적화를 통해 대규모 배열의 접두어 합계 작업에 대한 성능이 크게 향상됩니다. 두 패스 모두에 SIMD를 사용하면 효율성이 더욱 향상되어 계산 시간이 단축됩니다. 제공된 코드는 두 번째 패스에 SIMD를 활용하고 쿼드 코어 시스템에서 약 7배의 성능 향상을 달성합니다.
위 내용은 Intel CPU의 SIMD 명령어가 접두사 합계 알고리즘 성능을 크게 향상시킬 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!