gpt4 book ai didi

c++ - 在 parallel_for 循环中为每个线程分配内存

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:00:13 24 4
gpt4 key购买 nike

我最初有一个单线程循环,它遍历图像的所有像素,并且可以对数据进行各种操作。

我使用的库规定从图像中检索像素必须一次一行完成。为此,我 malloc 一个内存块,它可以容纳一行像素(BMM_Color_fl 是一个包含一个像素的 RGBA 数据作为四个浮点值的结构,而 GetLinearPixels () 将位图中的一行像素复制到 BMM_Color_fl 数组中。)

BMM_Color_fl* line = (BMM_Color_fl*)malloc(width * sizeof(BMM_Color_fl));
for (int y = 0; y < height, y++)
{
bmp->GetLinearPixels(0, y, width, line); //Copy data of row Y from bitmap into line.
BMM_Color_fl* pixel = line; //Get first pixel of line.
for (int x = 0; x < width; x++, pixel++) // For each pixel in the row...
{
//Do stuff with a pixel.
}
}
free(line);

到目前为止一切顺利!

为了减少这个循环的执行时间,我用parallel_for写了一个并发版本,如下所示:

parallel_for(0, height, [&](int y)
{
BMM_Color_fl* line = (BMM_Color_fl*)malloc(width * sizeof(BMM_Color_fl));
bmp->GetLinearPixels(0, y, width, line);
BMM_Color_fl* pixel = line;
for (int x = 0; x < width; x++, pixel++)
{
//Do stuff with a pixel.
}
free(line);
});

虽然多线程循环已经比原来的快了,但我意识到不可能所有线程都使用同一个内存块,所以目前我在每次循环迭代时分配和释放内存,这显然是浪费,因为会有永远不会有比循环迭代更多的线程。

我的问题是我是否以及如何让每个线程 malloc 正好是一个行缓冲区并重复使用它(理想情况下,在最后释放它)?

  • 作为免责声明,我必须声明我是 C++ 新手。

建议解决方案的实现:

Concurrency::combinable<std::vector<BMM_Color_fl>> line;

parallel_for(0, height, [&] (int y)
{
std::vector<BMM_Color_fl> lineL = line.local();
if (lineL.capacity() < width) lineL.reserve(width);

bmp->GetLinearPixels(0, y, width, &lineL[0]);

for (int x = 0; x < width; x++)
{
BMM_Color_fl* pixel = &lineL[x];
//Do stuff with a pixel.
}
});

按照建议,我取消了 malloc 并将其替换为 vector+reserve

最佳答案

您可以使用 Concurrency::combinable 类来实现这一点。我懒得贴代码了,但我相信这是可能的。

关于c++ - 在 parallel_for 循环中为每个线程分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9241456/

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