首頁 >後端開發 >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?

Intel 處理器上的SIMD 前綴和

簡介

對累積累積演算法和給定數組的。該操作在各種運算問題中都會遇到,並且需要高效能處理。在本文中,我們將討論 Intel CPU 上的 SIMD 指令是否可以增強前綴和演算法的效能。

使用 SIMD 的平行前綴和

一種平行前綴和演算法涉及分兩次執行操作。在第一遍中,並行計算部分和,然後累加每個部分和的總和。第二遍將每個部分和的總和加到下一個部分和中。透過 OpenMP 使用多執行緒實現並行性,並在第二遍使用 SIMD 指令可以提高效率。

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