有沒有辦法使用原子操作更新多個線程的最大值?從多個線程更新最大值
說明性實例:
std::vector<float> coord_max(128);
#pragma omp parallel for
for (int i = 0; i < limit; ++i) {
int j = get_coord(i); // can return any value in range [0,128)
float x = compute_value(j, i);
#pragma omp critical (coord_max_update)
coord_max[j] = std::max(coord_max[j], x);
}
在上述情況下,臨界段同步訪問整個矢量,而我們只需要訪問的每個值獨立地進行同步。
你不能使用新的'std :: atomic'? –
Nim
2013-02-18 11:29:46
OpenMP在'omp _ * _ lock()'系列中提供了它自己的一組精細鎖定函數。但真正的問題是:你真的需要細緻的鎖定嗎?整個'coord_max'向量跨越x86/x64上的8個緩存行,並且'get_coord()'返回遍及整個光譜的值,很有可能每個商店都會發生錯誤共享 - 這可能會更加不利於執行速度比同步代碼段。 – 2013-02-18 13:06:19
@Nim - 是'std :: atomic'無鎖?我懷疑它不是。 –
2013-02-19 16:26:21