vector<int> v;
#pragma omp parallel for ordered schedule(dynamic, anyChunkSizeGreaterThan1)
for (int i = 0; i < n; ++i){
...
...
...
#pragma omp ordered
v.push_back(i);
}
這填充v
與n
大小的有序列表。omp命令子句是如何工作的?
當達到omp ordered
塊時,所有線程都需要等待最低可能的迭代線程完成,但如果沒有任何線程被指定爲特定迭代,會怎麼樣呢?還是OpenMP運行時庫總是確保最低的迭代由某個線程處理?
此外,爲什麼建議ordered
子句與dynamic schedule
一起使用? static schedule
會影響性能嗎?
優秀的答案Hristo!現在都清楚了,謝謝! –
@ Cookie503,請注意,如果塊大小太小,則由於數據局部性丟失,緩存可能會變得不那麼有用。這可能會傷害你的表現比隱含的序列化更糟糕。試驗不同的塊大小,直到達到最佳加速。明智地使用'ordered'循環,如果可能的話避開它們,即使它導致增加的內存佔用 - 例如(根據你的具體例子),應該使用一個簡單的預分配數組(或其他線程安全的隨機訪問容器),而不是一個向量:'arr [i] = i;' –