我一直致力于为C ++中的Monopoly游戏制作模型。我的模型工作并且速度相当快,但我的顾问希望我添加多线程以加快速度。
我的系统是带有gcc 4.8.2的Linux;我有一台配备8核+ 16GB内存的AMD FX 8350。我也注意到我的MacBook上有Clang 6和Core i5有2核+ 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;
}
basePlayer
是一个包含播放器参数的数组。
我首先尝试使用C ++ 11中的std::async
和std::futures
(带std::launch::async
)。在我的主要内容中,我创建了std::future
s的向量,并添加futures.push_back(std::async(&playSet, basePlayer, numberOfGames / procs));
使用此设置运行100,000个游戏但没有启用线程(即那些注释掉并且只调用该函数的行)需要208.76秒(根据时间),208.32s用户和0.19s是sys时间。运行8个线程的相同数量的游戏给我208.53s,207.73s用户和0.42s系统时间。根本不是我的顾问所预期的加速(或者我希望的)。
然后我听说OpenMP,并决定试一试。我留下了C ++ 11线程的注释,并在函数内添加了#pragma omp parallel for
语句。
我再次运行了这样的100,000个游戏,它使用了642.63个实际用户,714.18s用户和高达3228.62秒的系统时间(启用了OpenMP)。
我已经运行了Valgrind / Helgrind,我已尽可能多地调试它,所有内容都会检查出来。假设实际玩游戏需要花费很多时间[分配内存/打乱缓存/其他一些解释]是否合理?有什么我可以尝试而不必要求任何人潜入几千行游戏代码?我知道这是一个广泛的问题,但是我已经把头发拉了几个月了,现在没有任何运气了。
如果您需要更多信息,请与我们联系。
基本上, play
是游戏的主要方法。我相信它受CPU限制。
我没有指定OMP_NUM_THREADS
,所以我假设它的默认值为8.我手动将其设置为8,时间相同。
Here's a Pastebin from a Massif report - 据我所知,内存使用量不多。
就设置时间与play
所花费的时间而言,所有已玩游戏的设置总共花费0.178161,而play
花费了87.0686。