【发布时间】:2021-08-03 13:47:31
【问题描述】:
让arr 声明如下。
std::vector<std::vector<int>> arr(10,000,000);
我的串行代码类似于
for (const auto [x, y] : XY) {
arr[x].push_back(y);
}
我使用openmp并定义了一个锁数组,如下所示。
std::vector<omp_lock_t> locks(10,000,000);
locks,我用
#pragma omp parallel for schedule(dynamic)
for (const auto [x, y] : XY) {
omp_set_lock(&locks[x]);
arr[x].push_back(y);
omp_unset_lock(&locks[x]);
}
这种方法适用于我的机器(windows linux 子系统)。但是后来我找到了以下帖子
c/c++ maximum number of mutexes allowed in Linux
这引起了我是否使用了太多锁的担忧,并且我的程序可能不适用于其他平台(允许的锁数量有限制的平台)。
我想知道是否还有另一种方式,我仍然具有与上述相同的控制粒度,并且它对允许的数量没有上限。我可以使用比较和交换之类的东西吗?
【问题讨论】:
-
这真的取决于你想做什么。在最简单的情况下,您可以只使用
std::atomic_int。 -
在“//更新a[i]”期间你做了什么?
-
简单点。只有一把锁,你不喜欢什么?
-
你为什么不使用std::mutex和std::condition_var?您可以决定为例如切片设置互斥锁。 1024 个元素。在 Linux 上,请参阅 futex(2) 和 GNU libc 或 MUSL libc 的源代码
-
您在
//update a[i]中所做的事情对于这个问题至关重要。对我来说,单独锁定每个 int 似乎是一种严重的矫枉过正。是否有可能 2 个线程同时访问同一个值?
标签: c++ multithreading parallel-processing openmp mutex