Rumah > pembangunan bahagian belakang > C++ > Bolehkah Arahan SIMD pada CPU Intel Meningkatkan Prestasi Algoritma Jumlah Awalan dengan ketara?

Bolehkah Arahan SIMD pada CPU Intel Meningkatkan Prestasi Algoritma Jumlah Awalan dengan ketara?

Patricia Arquette
Lepaskan: 2024-11-27 03:27:09
asal
866 orang telah melayarinya

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

Jumlah Awalan SIMD pada Pemproses Intel

Pengenalan

Algoritma jumlah awalan mencari jumlah terkumpul daripada tatasusunan yang diberikan. Operasi ini dihadapi dalam pelbagai masalah pengiraan dan memerlukan prestasi tinggi untuk pemprosesan yang cekap. Dalam artikel ini, kami membincangkan sama ada arahan SIMD pada CPU Intel boleh meningkatkan prestasi algoritma jumlah awalan.

Jumlah Awalan Selari dengan SIMD

Satu algoritma jumlah awalan selari melibatkan melakukan operasi dalam dua hantaran. Dalam hantaran pertama, jumlah separa dikira secara selari, diikuti dengan pengumpulan jumlah keseluruhan bagi setiap jumlah separa. Hantaran kedua menambah jumlah keseluruhan jumlah separa kepada yang seterusnya. Menggunakan berbilang benang melalui OpenMP untuk selari dan arahan SIMD untuk hantaran kedua boleh meningkatkan kecekapan.

Kod untuk Jumlah Awalan SIMD

Berikut ialah contoh kod untuk di atas algoritma:

__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);
    }
}
Salin selepas log masuk

Perbincangan

Pengoptimuman ini membolehkan peningkatan prestasi yang ketara untuk operasi jumlah awalan pada tatasusunan besar. Menggunakan SIMD untuk kedua-dua pas meningkatkan lagi kecekapan, mengurangkan masa pengiraan. Kod yang disediakan menggunakan SIMD untuk hantaran kedua dan mencapai peningkatan prestasi kira-kira 7x pada sistem empat teras.

Atas ialah kandungan terperinci Bolehkah Arahan SIMD pada CPU Intel Meningkatkan Prestasi Algoritma Jumlah Awalan dengan ketara?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan