gpt4 book ai didi

c++ - 多线程函数性能比单线程差

转载 作者:行者123 更新时间:2023-11-28 01:23:44 26 4
gpt4 key购买 nike

我写了一个在单线程上运行的 update() 函数,然后我写了下面的函数 updateMP() 除了我分工之外,它做同样的事情在我的两个 for 循环中,这里有一些线程:

void GameOfLife::updateMP()
{
std::vector<Cell> toDie;
std::vector<Cell> toLive;

#pragma omp parallel
{
// private, per-thread variables
std::vector<Cell> myToDie;
std::vector<Cell> myToLive;

#pragma omp for
for (int i = 0; i < aliveCells.size(); i++) {
auto it = aliveCells.begin();
std::advance(it, i);

int liveCount = aliveCellNeighbors[*it];
if (liveCount < 2 || liveCount > 3) {
myToDie.push_back(*it);
}
}

#pragma omp for
for (int i = 0; i < aliveCellNeighbors.size(); i++) {
auto it = aliveCellNeighbors.begin();
std::advance(it, i);

if (aliveCells.find(it->first) != aliveCells.end()) // is this cell alive?
continue; // if so skip because we already updated aliveCells

if (aliveCellNeighbors[it->first] == 3) {
myToLive.push_back(it->first);
}
}

#pragma omp critical
{
toDie.insert(toDie.end(), myToDie.begin(), myToDie.end());
toLive.insert(toLive.end(), myToLive.begin(), myToLive.end());
}
}

for (const Cell& deadCell : toDie) {
setDead(deadCell);
}

for (const Cell& liveCell : toLive) {
setAlive(liveCell);
}
}

我注意到它的性能比单线程 update() 差,而且似乎随着时间的推移越来越慢。

我认为 omp for 的两次使用可能是我做错了什么?我是 OpenMP 的新手,所以我仍在弄清楚如何使用它。

为什么我的多线程实现的性能越来越差?

编辑:完整来源在这里:https://github.com/k-vekos/GameOfLife/tree/hashing?files=1

最佳答案

Why am I getting worse performance with my multithreaded implementation?

经典问题:)

您只循环遍历活细胞。这其实很有趣。康威的生命游戏的天真实现会查看每个单元格。您的版本针对比死细胞更少的活细胞进行了优化,我认为这在游戏后期很常见。我无法从你的摘录中看出,但我认为当活细胞与死细胞的比例较高时,它可能会做一些多余的工作。

omp parallel 的一个警告是,不能保证在并行部分的进入/退出期间不会创建/销毁线程。它取决于实现。我似乎找不到有关 MSVC 实现的任何信息。有知道的请指教。

所以这意味着您的线程可以在每个更新循环中创建/销毁,这是一个沉重的开销。为了使它物有所值,工作量应该比管理费用高出几个数量级。

您可以分析/测量代码以确定管理费用和工作时间。它还应该可以帮助您了解真正的瓶颈所在。

Visual Studio 有一个带有漂亮 GUI 的探查器。您需要使用发布优化来编译您的代码,但还需要包括调试符号(默认发布配置中不包含这些符号)。我没有研究如何手动设置它,因为我通常使用 CMake,它会自动设置 RelWithDebInfo 配置。

使用 high_resolution_clock 为分析器难以测量的部分计时。

如果你可以使用 C++17,它有一个标准的并行 for_each(ExecutionPolicy 重载)。大多数算法标准功能都可以。 https://en.cppreference.com/w/cpp/algorithm/for_each .它们太新了,我对它们几乎一无所知(它们可能也有与 OpenMP 相同的问题)。

seems like it's getting slower over time.

会不会是您没有清理您的载体之一?

关于c++ - 多线程函数性能比单线程差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54914694/

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