有沒有這樣做的反指標?或者是指定的行爲?使用OpenMP與C++ 11基於範圍的for循環?
#pragma omp parallel for
for(auto x : stl_container)
{
...
}
因爲它似乎OpenMP規範僅適用於C++ 98,但我猜有可能是由於C++ 11多線程不兼容,在此不再使用。我想確定,仍然。
有沒有這樣做的反指標?或者是指定的行爲?使用OpenMP與C++ 11基於範圍的for循環?
#pragma omp parallel for
for(auto x : stl_container)
{
...
}
因爲它似乎OpenMP規範僅適用於C++ 98,但我猜有可能是由於C++ 11多線程不兼容,在此不再使用。我想確定,仍然。
OpenMP 4.0規範在幾天前完成併發布了here。它仍然強制要求的並行循環,應在規範形式(§2.6,第51頁):
for (
INIT-EXPR;
測試EXPR;
INCR-EXPR)
構造塊
該標準允許對提供在所有的表達式中使用的隨機訪問迭代容器,例如:
#pragma omp parallel for
for (it = v.begin(); it < v.end(); it++)
{
...
}
如果仍堅持使用C++ 11語法糖,如果它需要一個(比較)大量的時間來處理的stl_container
每個元素,則可以使用單生產者任務圖案:
#pragma omp parallel
{
#pragma omp single
{
for (auto x : stl_container)
{
#pragma omp task
{
// Do something with x, e.g.
compute(x);
}
}
}
}
任務會產生一定的開銷,所以如果compute(x);
花費很少的時間來完成,那麼使用這種模式是沒有意義的。
+好問題。也想知道。 – lulyon