ฉันใช้ OpenMP เพื่อทำให้ไลบรารี C++ ของเราขนานกัน ในนั้น เรามีสถานที่หลายแห่งที่เราหลีกเลี่ยงการคำนวณบางสิ่งใหม่โดยการจัดเก็บผลลัพธ์ไว้ในตัวแปร (เช่น การแคชผลลัพธ์เพื่อนำกลับมาใช้ใหม่) อย่างไรก็ตาม ลักษณะการทำงานนี้ถูกซ่อนไว้สำหรับผู้ใช้ในวิธีการตามคลาส ตัวอย่างเช่น ในการใช้วิธีการครั้งแรก แคชจะถูกเติมเต็ม การใช้งานที่ตามมาทั้งหมดจะอ่านจากแคชเท่านั้น
ปัญหาของฉันคือตอนนี้ในโปรแกรมแบบมัลติเธรด หลายเธรดสามารถเรียกใช้เมธอดดังกล่าวได้พร้อมกัน ส่งผลให้เกิดสภาวะการแข่งขันในการสร้าง/เข้าถึงแคช ขณะนี้ฉันกำลังแก้ไขสิ่งนั้นโดยการวางแคชไว้ในส่วนที่สำคัญ แต่สิ่งนี้จะทำให้ทุกอย่างช้าลงแน่นอน
คลาสตัวอย่างอาจเป็นดังนี้
class A {
public:
A() : initialized(false)
{}
int get(int a)
{
#pragma omp critical(CACHING)
if (!initialized)
initialize_cache();
return cache[a];
}
private:
bool initialized;
void initialize_cache()
{
// do some heavy stuff
initialized=true;
}
int *cache;
};
มันจะดีกว่าถ้าส่วนที่วิกฤติอยู่ในฟังก์ชัน Initialize_cache() เนื่องจากมันจะล็อคเธรดทั้งหมดเมื่อยังไม่ได้เตรียมใช้งานแคชเท่านั้น (นั่นคือเพียงครั้งเดียว) แต่ดูเหมือนว่าจะเป็นอันตรายเนื่องจากอาจลองใช้หลายเธรดได้ เพื่อเริ่มต้นแคชในเวลาเดียวกัน
ข้อเสนอแนะใด ๆ เพื่อปรับปรุงสิ่งนี้? ตามหลักการแล้วโซลูชันจะเข้ากันได้กับ OpenMP เวอร์ชันเก่ากว่า (แม้แต่ v2 สำหรับ Visual Studio...)
PS: สิ่งนี้อาจถูกถามมาก่อน แต่การค้นหา openmp และแคชทำให้เกิดสิ่งต่าง ๆ มากมายบนแคชตัวประมวลผล ซึ่งไม่ใช่สิ่งที่ฉันอยากรู้...