C++中的Blit函数(线程)

b09cbbtk  于 2023-04-08  发布在  其他
关注(0)|答案(1)|浏览(145)

我在C++中玩过线程,发现了一些有趣的结果。目标是将image(2560 x1440)完全设置为白色-〉array〈int,3〉{255,255,255}。第一次运行是单线程的。
第二次和第三次运行是16线程(我的机器可以做到这一点)。

vector<array<int,3>> image { 2560*1440 };
// measure begins here ...
for (std::size_t i=0; i<1440; ++i)
  for (std::size_t j=0; j<2560; ++j)
    image[i*2560+j] = {255,255,255};

第一个螺纹:

vector<array<int,3>> image { 2560*1440 };
auto n = thread::hardware_concurrency();
auto execution = [&](std::size_t id) {
  for (std::size_t i=0; i<1440; ++i)
    for (std::size_t j=id; j<2560; j+=n)
      image[i*2560+j] = {255,255,255};
};

第二个线程:

vector<array<int,3>> image { 2560*1440 };
auto n = thread::hardware_concurrency();
auto execution = [&](std::size_t id) {
  for (std::size_t i=id; i<1440; i+=n)
    for (std::size_t j=0; j<2560; ++j)
      image[i*2560+j] = {255,255,255};
};

第三个的性能明显更好:

  • 单次:28076微秒
  • 第一个螺纹:24688微秒
  • 第二螺纹:4073微秒

有没有人能解释一下,为什么它会有这么大的改善?是因为指针的“移动”变少了吗?

6vl6ewon

6vl6ewon1#

在第一个线程示例中,您逐行读取并在该行中跳转n个像素,因此阅读不是顺序的,缓存对CPU来说变得更加困难。
在第二个线程示例中,您按n跳转行,但顺序访问像素,从而减少缓存未命中并提高性能。

相关问题