การใช้ #pragma omp แบบขนานเพื่อทำให้โปรแกรมช้าลง

โปรแกรม C++ ของฉันใช้เวลาประมาณ 300 วินาทีในการทำงาน ภายในโปรแกรมของฉัน ฉันต้องหารเวกเตอร์ของฉันด้วย cwis เครื่องวิเคราะห์ VS บอกว่าการดำเนินการนี้ใช้เวลาประมาณ 15% ของเวลาทำงาน นี่คือรหัส:

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)
    {
        ....
    }
}

ฟังก์ชั่นนี้ถูกเรียกหลายครั้ง ถ้าฉันใช้ #pragma ... ก่อนการวนซ้ำ การใช้งาน cpu จะคงอยู่ 100% เป็นเวลาประมาณ 350 วินาที ซึ่งมากกว่าเวลาที่ใช้ในการรันโปรแกรมตามลำดับ

ฉันจะขอบคุณถ้าใครสามารถช่วยฉันในเรื่องนี้


person Javad R    schedule 08.02.2015    source แหล่งที่มา
comment
vec1._rowsใหญ่แค่ไหน?   -  person Oliver Charlesworth    schedule 08.02.2015
comment
r ใน for ลูปควรถูกกำหนดก่อน for เอง แบบนี้: int r; #pragma.... for(r = 1...)   -  person Michał Walenciak    schedule 08.02.2015
comment
พยายามหาขอบเขตขนานออกไปด้านนอก หากคุณเรียกใช้ฟังก์ชันหลายครั้ง คุณจะต้องจ่ายเงินสำหรับการเริ่มต้นทุกครั้งที่เรียกใช้ด้วย   -  person Chiel    schedule 08.02.2015
comment
@ MichałWalenciak อืมไม่สำหรับขนานสำหรับการวางตัวแปรลูปนอกลูปหมายความว่าค่า 'สุดท้าย' จะต้องได้รับการเก็บรักษาโดย omp นี่เป็นค่าใช้จ่ายเพิ่มเติมและจะทำให้การทำงานช้าลง (เล็กน้อย).   -  person user3710044    schedule 08.02.2015
comment
@javad คุณใช้ Windows ใช่ไหม? Taskman บน Windows บอกว่า 25% สำหรับหนึ่งคอร์บนเครื่อง 4 คอร์ คำถามโง่ๆ จริงๆ ที่นี่ ... คุณใช้เครื่องมัลติคอร์ใช่ไหม   -  person user3710044    schedule 08.02.2015
comment
@ user3710044: ดูที่นี่: th wikipedia.org/wiki/ ในตัวอย่าง for มันบอกว่า: สังเกตว่าตัวนับการวนซ้ำ j และ k จะต้องถูกทำให้เป็นส่วนตัว หากคุณต้องการทำเครื่องหมายบางอย่างเป็น public หรือ private จะต้องมีอยู่แล้ว (ดังนั้นจะต้องมองเห็นได้ก่อน #pragma)   -  person Michał Walenciak    schedule 08.02.2015
comment
@ MichałWalenciak จริง แต่แล้วตัวแปรลูปที่กำหนดภายในลูปนั้นเป็นไปตามคำจำกัดความส่วนตัว   -  person user3710044    schedule 08.02.2015
comment
คุณกำลังรวบรวมในโหมดเผยแพร่หรือไม่? คุณได้เปิดใช้งาน OpenMP ใน MSVC แล้วหรือยัง?   -  person Z boson    schedule 09.02.2015


คำตอบ (2)


สิ่งนี้อาจผิดพลาดได้หลายวิธี:

  1. โดยไม่ทราบประเภทของ result อาจเป็นไปได้ว่าจะต้องสร้างสิ่งกีดขวางเพื่อหลีกเลี่ยงสภาพการแข่งขันเมื่อทำการแก้ไข คุณสามารถหลีกเลี่ยงได้โดยใช้เวกเตอร์ผลลัพธ์แบบขนานที่คุณรวมเข้าด้วยกันในภายหลัง
  2. ค่าใช้จ่ายในการคัดลอกสำหรับเวกเตอร์ vec1 และ vec2 อาจมากกว่ารางวัลด้านประสิทธิภาพ

โดยสรุป นี่คือคำถามเกี่ยวกับประเภทเวกเตอร์ที่สามารถใช้งานแบบขนานได้ โปรดดูเอกสารประกอบ openMP ที่คุณเลือก เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับประเภทที่เข้าถึงแบบขนานได้

person Marcus Müller    schedule 08.02.2015

อย่างไรก็ตามฉันเพิ่งดูมันและจากข้อกำหนด OMP ...

• การโยนที่ดำเนินการภายในขอบเขตลูปจะต้องทำให้การดำเนินการดำเนินต่อไปภายในการวนซ้ำเดียวกันของขอบเขตลูป และเธรดเดียวกันที่ทำให้เกิดข้อยกเว้นจะต้องจับได้

ฉันรู้ว่าฉันไม่ชอบรูปลักษณ์ที่เป็นข้อยกเว้น

OpenMP API V4.0 หน้า 59

person user3710044    schedule 08.02.2015