menggunakan #pragma omp parallel untuk membuat program lebih lambat

Program C++ saya membutuhkan waktu sekitar 300 detik untuk dijalankan. Di dalam program saya, saya perlu membagi vektor saya. Penganalisis VS memberi tahu bahwa ini membutuhkan sekitar 15% waktu berjalan. ini kodenya:

template <class T> myVector<T> cWisDivide(myVector<T> &vec1, 

myVector<T> &vec2)
{
    try
    {
        if (vec1._rows == vec2._rows)
        {
            myVector<T> result(vec1._rows);
            //#pragma omp parallel for 
            for (int r = 1; r <= vec1._rows; r++)
            {
                if (vec2(r) != 0)
                {
                    result(r) = vec1(r) / vec2(r);
                }
                else
                {
                    throw std::runtime_error("");
                }
            }
            return result;
        }
    }
    catch (const exception &e)
    {
        ....
    }
}

fungsi ini dipanggil berkali-kali. Jika saya menggunakan #pragma ... sebelum loop, penggunaan cpu tetap 100% selama sekitar 350 detik. yang lebih lama dari waktu yang dibutuhkan untuk menjalankan program secara berurutan.

Saya akan sangat menghargai jika ada yang bisa membantu saya dalam masalah ini.


person Javad R    schedule 08.02.2015    source sumber
comment
Seberapa besar vec1._rows?   -  person Oliver Charlesworth    schedule 08.02.2015
comment
r dalam for loop harus didefinisikan sebelum for itu sendiri. Seperti ini: int r; #pragma.... for(r = 1...)   -  person Michał Walenciak    schedule 08.02.2015
comment
Cobalah untuk mengerjakan wilayah paralel lebih jauh ke arah luar. Jika Anda memanggil fungsi tersebut berkali-kali, Anda juga membayar untuk inisialisasi setiap kali Anda memanggilnya   -  person Chiel    schedule 08.02.2015
comment
@MichałWalenciak Um, tidak, karena paralel untuk meletakkan variabel loop di luar loop berarti nilai 'terakhir' harus dipertahankan oleh omp. Ini merupakan overhead tambahan dan akan memperlambatnya. (sedikit).   -  person user3710044    schedule 08.02.2015
comment
@javad, Anda menggunakan Windows kan? Taskman di Windows mengatakan 25% untuk satu inti pada mesin 4 inti. Pertanyaan yang sangat bodoh di sini ... Anda menggunakan mesin multi-core bukan?   -  person user3710044    schedule 08.02.2015
comment
@ user3710044: lihat di sini: en. wikipedia.org/wiki/ pada contoh for. Bunyinya: Perhatikan bagaimana penghitung iterasi j dan k harus dibuat pribadi. Jika Anda ingin menandai sesuatu sebagai public atau private maka harus sudah ada (jadi harus terlihat sebelum #pragma)   -  person Michał Walenciak    schedule 08.02.2015
comment
@MichałWalenciak, benar, tetapi variabel loop yang didefinisikan dalam loop menurut definisi bersifat pribadi.   -  person user3710044    schedule 08.02.2015
comment
Apakah Anda mengkompilasi dalam mode rilis? Sudahkah Anda mengaktifkan OpenMP di MSVC?   -  person Z boson    schedule 09.02.2015


Jawaban (2)


Hal ini bisa menjadi salah dalam beberapa hal:

  1. tanpa mengetahui jenis result, mungkin saja penghalang harus dibuat untuk menghindari kondisi balapan saat memodifikasinya -- Anda dapat menghindarinya dengan memiliki vektor hasil paralel yang Anda gabungkan setelahnya.
  2. salinan overhead untuk vektor vec1 dan vec2 mungkin lebih besar daripada imbalan kinerja.

secara keseluruhan, ini adalah pertanyaan tentang tipe vektor yang dapat diparalelkan -- lihat dokumentasi pilihan openMP Anda untuk mempelajari lebih lanjut tentang tipe yang dapat diakses secara paralel.

person Marcus Müller    schedule 08.02.2015

Oya, saya baru mencarinya dan dari spesifikasi OMP...

• Pelemparan yang dieksekusi di dalam wilayah perulangan harus menyebabkan eksekusi dilanjutkan dalam iterasi yang sama di wilayah perulangan, dan thread yang sama yang melemparkan pengecualian harus menangkapnya.

Aku tahu aku tidak menyukai tampilan pengecualian itu.

OpenMP API V4.0 halaman 59.

person user3710044    schedule 08.02.2015