ZBLOG

#pragma omp parallel for collapse(2) for (int i = 0; i < rectangleImageOut.rows; ++i) { for (int j = 0; j < rectangleImageOut.cols; ++j) { cv::Point2f point(j, i); double p1 = GetDot(vertices[0], ver...

是的,这段代码在并行化时存在潜在的冲突。多个线程同时访问和写入rectangleImageOut矩阵的同一元素可能导致数据竞争和不确定的结果。

为了解决这个问题,您可以使用OpenMP中的临界区(critical section)来保护对共享变量的写操作,确保每次只有一个线程能够进行写入操作。修正后的代码如下:

#pragma omp parallel for collapse(2)
for (int i = 0; i < rectangleImageOut.rows; ++i)
{
    for (int j = 0; j < rectangleImageOut.cols; ++j)
    {
        cv::Point2f point(j, i);
        double p1 = GetDot(vertices[0], vertices[1], point); // 0和1
        double p2 = GetDot(vertices[0], vertices[3], point); // 0和3
        double p3 = GetDot(vertices[2], vertices[3], point); // 2和3
        double p4 = GetDot(vertices[2], vertices[1], point); // 2和1
        if (p1 < 0 || p2 < 0 || p3 < 0 || p4 < 0)
        {
            #pragma omp critical
            {
                rectangleImageOut.at<uchar>(i, j) = 0;
            }
        }
    }
}

通过添加#pragma omp critical指令,将对rectangleImageOut矩阵元素的写操作限制为一次只有一个线程执行,避免了潜在的冲突和竞争条件。这样可以确保线程安全,但可能会影响并行性能。请根据实际情况进行测试和调优。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=16415

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?