添加线程时速度明显减慢 我一直在为C++中的游戏专卖做模型。我的模型工作正常,速度也相当快,但是我的顾问希望我添加多线程来加速它
我的系统是Linux和GCC4.8.2;我有一个8核+16GB内存的AMD FX 8350。我还注意到,在我的MacBook上,Clang 6和Core i5的两个内核+HT的性能相当 适用的功能是:添加线程时速度明显减慢 我一直在为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;
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_线程的价值是什么更新了我的帖子。@DavidSchwartzplay
做了很多事情,但它应该是CPU限制的。@Kam默认值为8。我想尝试的一件事是创建一个完全受CPU限制的play
,以确定问题的位置。我建议您添加一个多线程标签