添加线程时速度明显减慢 我一直在为C++中的游戏专卖做模型。我的模型工作正常,速度也相当快,但是我的顾问希望我添加多线程来加速它

添加线程时速度明显减慢 我一直在为C++中的游戏专卖做模型。我的模型工作正常,速度也相当快,但是我的顾问希望我添加多线程来加速它,c++,multithreading,openmp,C++,Multithreading,Openmp,我的系统是Linux和GCC4.8.2;我有一个8核+16GB内存的AMD FX 8350。我还注意到,在我的MacBook上,Clang 6和Core i5的两个内核+HT的性能相当 适用的功能是: int playSet(const int* basePlayer, int numberOfGames) { int num1won = 0; #pragma omp parallel for for (int i = 0; i < numberOfGames;

我的系统是Linux和GCC4.8.2;我有一个8核+16GB内存的AMD FX 8350。我还注意到,在我的MacBook上,Clang 6和Core i5的两个内核+HT的性能相当

适用的功能是:

int playSet(const int* basePlayer, int numberOfGames)
{
    int num1won = 0;

    #pragma omp parallel for
    for (int i = 0; i < numberOfGames; i++)
    {
        Player player1(basePlayer);

        Player* opponent = generateRandomPlayer(2);

        // Let's play!
        std::vector<Player*> players = {&player1, opponent};

        Game currentGame(players, NUMBER_OF_TURNS);

        int winner = currentGame.play().winner;

        if (1 == winner)
        {
            num1won++;
        }

        delete opponent;
}
int游戏集(const int*basePlayer,int numberOfGames)
{
int num1won=0;
#pragma-omp并行
for(int i=0;i
basePlayer
是一个包含播放器参数的数组

我第一次尝试使用C++11中的
std::async
std::futures
(使用
std::launch::async
)。主要是创建一个
std::future
s的向量,并使用
futures添加到其中。推回(std::async(&playSet,basePlayer,numberOfGames/procs));

在不启用线程的情况下运行100000个游戏(即那些被注释掉的行,只调用函数)需要208.76秒(根据时间),208.32s用户和0.19s是系统时间。用8个线程运行相同数量的游戏会给我208.53s、207.73s用户和0.42s系统时间。这完全不是我的顾问期望的(或我希望的)加速

然后我听说了OpenMP,并决定试一试。我将C++11线程的东西注释掉,并在函数中添加了
#pragma omp parallel for
语句

我再次运行了100000个这样的游戏,用了642.63秒的真实时间、714.18秒的用户时间和3228.62秒的系统时间(启用OpenMP)

我已经运行了Valgrind/Helgrind,我已经尽我所能对它进行了调试,一切都正常了。假设实际游戏需要这么多时间[分配内存/刷新缓存/其他解释]是否合理?有什么我可以尝试而不必要求任何人浏览几千行游戏代码的方法吗?我知道这是一个广泛的问题,但我在这方面已经花了几个月的时间,没有任何运气了

如果您需要更多信息来帮助,请告诉我

play
基本上是游戏的主要方法。我相信它是CPU受限的

我没有指定
OMP\u NUM\u THREADS
,所以我假设默认值为8。我手动将其设置为8,时间相同

-据我所知,没有那么多内存使用


就设置时间与玩
play
所花费的时间而言,所有玩过的游戏的设置时间总计为0.178161秒,玩
play
所花费的时间为87.0686秒。我们需要知道代码实际在做什么。玩
play
做什么?它是纯CPU限制的吗?它是否操纵任何共享结构?OMP_NUM_线程的价值是什么更新了我的帖子。@DavidSchwartz
play
做了很多事情,但它应该是CPU限制的。@Kam默认值为8。我想尝试的一件事是创建一个完全受CPU限制的
play
,以确定问题的位置。我建议您添加一个多线程标签