Rumah > pembangunan bahagian belakang > C++ > Apakah Alternatif kepada std::vector dalam C OpenMP Parallel For Loops?

Apakah Alternatif kepada std::vector dalam C OpenMP Parallel For Loops?

Barbara Streisand
Lepaskan: 2024-11-28 20:30:13
asal
308 orang telah melayarinya

What are the Alternatives to std::vector in C   OpenMP Parallel For Loops?

C OpenMP Parallel For Loop: Alternatif kepada std::vector

std::vector ialah struktur data serba boleh yang biasa digunakan secara selari untuk gelung dengan OpenMP. Walau bagaimanapun, terdapat situasi di mana alternatif mungkin lebih sesuai, terutamanya apabila mengutamakan kelajuan atau menghadapi masalah dengan mengubah saiz semasa gelung.

Satu pilihan untuk struktur data kongsi ialah menggunakan pengurangan tersuai dengan OpenMP 4.0 's #pragma omp mengisytiharkan pengurangan. Ini mengurangkan keperluan untuk bahagian kritikal dan memudahkan kod selari.

Alternatif lain untuk mengekalkan ketenteraman ialah menggunakan penjadualan statik dengan bahagian tertib. Ini memastikan bahawa setiap urutan menulis pada bahagian tertentu vektor mengikut tertib, menghapuskan keperluan untuk digabungkan kemudian.

Dalam senario di mana saiz semula diperlukan, kaedah menggunakan tatasusunan penunjuk untuk menjejak benang -jumlah awalan khusus boleh diterima pakai. Pendekatan ini mengelakkan overhed mengubah saiz pada laluan kritikal.

Berikut ialah contoh kod untuk alternatif ini:

// Custom reduction
#pragma omp declare reduction (merge: std::vector<int>: omp_out.insert(omp_out.end(), omp_in.begin(), omp_in.end())

std::vector<int> vec;
#pragma omp parallel for reduction(merge: vec)
for (int i = 0; i < 100; i++) vec.push_back(i);
Salin selepas log masuk
// Static scheduling with ordered sections
std::vector<int> vec;
#pragma omp parallel
{
    int ithread = omp_get_thread_num();
    int nthreads = omp_get_num_threads();
    #pragma omp single
    {
        prefix = new size_t[nthreads + 1];
        prefix[0] = 0;
    }
    std::vector<int> vec_private;
    #pragma omp for schedule(static) nowait
    for (int i = 0; i < 100; i++) {
        vec_private.push_back(i);
    }
    prefix[ithread + 1] = vec_private.size();
    #pragma omp barrier
    #pragma omp single
    {
        for (int i = 1; i < (nthreads + 1); i++)
            prefix[i] += prefix[i - 1];
        vec.resize(vec.size() + prefix[nthreads]);
    }
    std::copy(vec_private.begin(), vec_private.end(), vec.begin() + prefix[ithread]);
}
delete[] prefix;
Salin selepas log masuk

Memilih alternatif yang sesuai untuk kes khusus anda bergantung pada keperluan dan pertimbangan prestasi. Percubaan dan profil boleh membantu menentukan penyelesaian yang paling optimum.

Atas ialah kandungan terperinci Apakah Alternatif kepada std::vector dalam C OpenMP Parallel For Loops?. 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