gpt4 book ai didi

c++ - 将 openmp 更改为 tbb

转载 作者:太空狗 更新时间:2023-10-29 23:02:50 25 4
gpt4 key购买 nike

#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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com