Saya menggunakan OpenMP untuk memparalelkan perpustakaan C++ kami. Di sana, kami memiliki berbagai tempat di mana kami menghindari menghitung ulang beberapa hal dengan menyimpan hasil dalam sebuah variabel (yaitu menyimpan hasil dalam cache untuk digunakan kembali). Namun, perilaku ini disembunyikan bagi pengguna dalam metode kelas. Misalnya, saat pertama kali menggunakan suatu metode, cache akan terisi. Semua penggunaan selanjutnya hanya akan dibaca dari cache.
Masalah saya sekarang adalah bahwa dalam program multi-utas, beberapa utas dapat memanggil metode seperti itu secara bersamaan, sehingga mengakibatkan kondisi balapan dalam membuat/mengakses cache. Saat ini saya sedang menyelesaikannya dengan meletakkan cache di bagian kritis, tetapi ini tentu saja memperlambat semuanya.
Contoh kelasnya mungkin sebagai berikut
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;
};
Akan lebih baik jika bagian kritis berada dalam fungsi inisialisasi_cache(), karena itu hanya akan mengunci semua utas ketika cache belum diinisialisasi (yaitu hanya sekali), tetapi itu tampaknya berbahaya karena beberapa utas dapat mencoba untuk menginisialisasi cache secara bersamaan.
Adakah saran untuk memperbaikinya? Idealnya solusinya akan kompatibel dengan versi OpenMP yang lebih lama (bahkan v2 untuk Visual Studio...)
PS: Ini mungkin sudah ditanyakan sebelumnya, tapi pencarian openmp dan caching memunculkan banyak hal pada cache prosesor, bukan itu yang ingin saya ketahui...