我在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微秒
有没有人能解释一下,为什么它会有这么大的改善?是因为指针的“移动”变少了吗?
1条答案
按热度按时间6vl6ewon1#
在第一个线程示例中,您逐行读取并在该行中跳转
n
个像素,因此阅读不是顺序的,缓存对CPU来说变得更加困难。在第二个线程示例中,您按
n
跳转行,但顺序访问像素,从而减少缓存未命中并提高性能。