c++ - 将 openmp 更改为 tbb

标签 c++ multithreading openmp tbb

#pragma omp parallel for private(x,y)
for (int j = 0; j < nDstSizeY; j++)
{

   for (int i = 0; i < nDstSizeX; i++){

        x = MapX.at<float>(j, i);
        y = MapY.at<float>(j, i);

        if (nSrcType == CV_8UC1)
        {
            Dst.at<uchar>(j, i) = Bilinear8UC1(Src, x, y);
        }
        else
        {
            Dst.at<Vec3b>(j, i) = Bilinear8UC3(Src, x, y);
        }
    }
}

我想将代码制作成 tbb 但在局部变量问题中(openmp 上的 private(x,y)) 我的程序没有运行得更快我的 tbb 代码是这样的

tbb::parallel_for(0, nDstSizeY, [&](int j){
    for (int i = 0; i < nDstSizeX; i++)
    {
        x = MapX.at<float>(j, i);
        y = MapY.at<float>(j, i);

        if (nSrcType == CV_8UC1)
        {
            Dst.at<uchar>(j, i) = Bilinear8UC1(Src, x, y);
        }
        else
        {
            Dst.at<Vec3b>(j, i) = Bilinear8UC3(Src, x, y);
        }
    }
});

我该如何解决?抱歉我的英语不好

最佳答案

由于 [&]xy 在线程之间共享,因此对 TBB 的转换不一致。如果您想在转换为 TBB 时保持 private(x,y) 不变,请将其显式添加到 lambda 捕获中:

[&,x,y](int j)

或者只在 lambda 中声明局部变量 x & y。 否则,它会导致共享 xy 上的数据竞争。

另一个建议是使用 blocked_range2d这可能会启用一些额外的缓存优化:

tbb::parallel_for( tbb::blocked_range2d<int>(0, nDstSizeY, 0, nDstSizeX)
                 , [&](tbb::blocked_range2d<int> r) {
  for( int j = r.rows().begin(); j < r.rows().end(); j++ )
      for( int i = r.cols().begin(); i < r.cols().end(); i++ ) {
          int x = MapX.at<float>(j, i);
          int y = MapY.at<float>(j, i); // note: locally declared variables

          if (nSrcType == CV_8UC1)
              Dst.at<uchar>(j, i) = Bilinear8UC1(Src, x, y);
          else
              Dst.at<Vec3b>(j, i) = Bilinear8UC3(Src, x, y);
      }
});

关于c++ - 将 openmp 更改为 tbb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27392388/

相关文章:

c++ - 将一个模板包装在另一个模板中

c++ - 如何创建比我的教科书提供的更容易的线性搜索算法

c++ - 使用模板 boost 随机性

c# - 后台线程与 UI 线程

javascript - SetInterval 是否在单独的线程上运行?该方法如何工作?

c++ - OpenMP自动更新数组值

c++ - 如何在 UML 中对两个 C++ 类(在不同线程中)之间的消息接口(interface)进行建模?

java - Android ScheduledExecutorService

c++ - 为什么 OpenMP 'simd' 比 'parallel for simd' 有更好的性能?

python - OpenMP和Python