我正在嘗試使用OpenMP實現單生產者 - 多消費者模型(我知道我也可以去尋找更適合的升級線程)。使用OpenMP的消費者生產者模型
這裏是我的代碼,這是相當簡單,使用一個線程感知隊列類型:
bool producer_finished = false;
#pragma omp parallel default(none) shared(producer_finished, buffer, datagen)
{
#pragma omp sections
{
#pragma omp section
{ // single producer
while(datagen) {
DType data = datagen.next()
buffer.push(data);
}
producer_finished = true;
#pragma omp flush(producer_finished)
} // end omp section
#pragma omp section
{
#pragma omp for schedule(static, 1)
for (int i = 0; i < omp_get_max_threads() - 1; ++i) {
while (! producer_finished) {
#pragma omp critical(buffer)
{
DType = buffer.pop();
}
processData(data);
outputData(data);
#pragma omp flush(producer_finished)
}
} // end omp for
} // end omp section
} //end omp sections
} // end omp parallel
這裏的問題是,直到緩衝區滿,但消費者永遠不會開始生產啓動和推動數據。如果我刪除「for pragma」部分,也會發生同樣的情況。你能看到我的方法有什麼問題嗎?
我也編譯期間得到這樣的警告:
warning: work-sharing region may not be closely nested inside of work-sharing, critical, ordered or master region
它指的是在部分循環嵌套。在這種情況下,正確的做法是什麼?
感謝您的反饋。
編輯:剛剛發現this related question,set_omp_nested(1)沒有幫助我。我會嘗試把它放在單獨的函數中......
好的,這也是我的印象,我想我會使用boost線程來實現它。我只想用現有代碼快速實現,因爲我已經知道一些OpenMP ...(儘管應該可以使用boost部分/任務) – fungs