Mat*_*ary 6 c++ parallel-processing opencv
我想加速一个算法(完整的本地二进制模式与圆形邻居),我遍历所有像素并用它的邻居计算一些东西(所以我需要邻居像素访问)。
目前我通过用一个线程/进程迭代所有像素来做到这一点。我想通过将输入图像分成多个 ROI 并单独计算每个 ROI(使用多个线程)来并行化此任务。
这里的问题是,ROI 是重叠的(因为要计算一个像素,有时我需要看远处的邻居),并且多个线程可能同时访问像素数据(READING)。如果两个或多个线程同时在相同的索引上读取相同的 Mat,这是一个问题吗?
如果我写入相同的 Mat 并行但使用不同的索引,这也是一个问题吗?
只要写入和读取没有同时发生,多个并发读取就是安全的。
这适用于任何健全的系统。
考虑替代方案:
如果存在竞争条件,则意味着存储对象的内存在读取操作期间被修改。如果在读取期间没有写入内存(存储对象),则线程之间不可能进行交互。
最后,如果你看一下文档,
https://docs.opencv.org/3.1.0/d3/d63/classcv_1_1Mat.html
您会看到两次提到线程安全:
因此,在不同线程中异步操作相同的矩阵是安全的。
他们在矩阵分配期间执行的引用计数中提到了这一点。因此,至少可以在多个线程中安全地从同一矩阵分配给另外两个矩阵。这几乎保证了简单的读取访问也是线程安全的。