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);
// 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;
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!