Có cách nào để cập nhật tối đa từ nhiều luồng bằng cách sử dụng các phép toán nguyên tử không?Cập nhật giá trị tối đa từ nhiều chủ đề
minh họa ví dụ:
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);
}
Trong trường hợp trên, phần quan trọng đồng bộ hóa quyền truy cập vào toàn bộ vector, trong khi chúng ta chỉ cần để đồng bộ hóa truy cập vào mỗi trong những giá trị độc lập.
bạn không thể sử dụng 'std :: atomic 'mới? –
Nim
OpenMP cung cấp tập các chức năng khóa hạt mịn của riêng nó trong gia đình 'omp _ * _ lock()'.Nhưng câu hỏi thực sự là: bạn có thực sự cần khóa hạt mịn không? Toàn bộ 'coord_max' vectơ kéo dài 8 dòng bộ đệm trên x86/x64 và khi' get_coord() 'trả về các giá trị nằm rải rác trong toàn bộ quang phổ, có một cơ hội lớn mà chia sẻ sai sẽ xảy ra trên mỗi cửa hàng - điều này có thể gây bất lợi cho tốc độ thực thi so với phần mã được đồng bộ hóa. –
@Nim - là 'std :: nguyên tử' không có khóa? Tôi nghi ngờ nó không phải. –