>백엔드 개발 >C++ >Intel CPU의 SIMD 명령어가 접두사 합계 알고리즘 성능을 크게 향상시킬 수 있습니까?

Intel CPU의 SIMD 명령어가 접두사 합계 알고리즘 성능을 크게 향상시킬 수 있습니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-27 03:27:09868검색

Can SIMD Instructions on Intel CPUs Significantly Improve Prefix Sum Algorithm Performance?

인텔 프로세서의 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(&amp;a[4 * i]);
        __m128 out = scan_SSE(x);
        out = _mm_add_ps(out, offset);
        _mm_store_ps(&amp;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(&amp;s[4 * i]);
        tmp1 = _mm_add_ps(tmp1, offset);
        _mm_store_ps(&amp;s[4 * i], tmp1);
    }
}

토론

이러한 최적화를 통해 대규모 배열의 접두어 합계 작업에 대한 성능이 크게 향상됩니다. 두 패스 모두에 SIMD를 사용하면 효율성이 더욱 향상되어 계산 시간이 단축됩니다. 제공된 코드는 두 번째 패스에 SIMD를 활용하고 쿼드 코어 시스템에서 약 7배의 성능 향상을 달성합니다.

위 내용은 Intel CPU의 SIMD 명령어가 접두사 합계 알고리즘 성능을 크게 향상시킬 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.