我是 C++ 编程和 Stackoverflow 方面的初学者,我需要让我的 BlackJack 赔率模拟器运行得更快,它使用 1 个内核和 25% 的 i5 CPU,运行速度更快 - 最好快 3-4 倍。我对并行化循环的所有不同方式感到不知所措,该程序的 CPU 最密集功能中的最外层循环一直运行良好,尽管速度很慢,但没有并行化。我在 Microsoft Visual Studio 2012 上运行我的程序,我尝试了由并发库提供的并行化 for 循环,但是当我测试它时,任务管理器显示,它并没有像我想要的那样获得 4 个线程和 100% 的 cpu 使用率该进程在不同数量的线程和不同数量的 CPU 使用情况下进行混洗,并且它的执行速度没有我想要的那么快。http://msdn.microsoft.com/en-us/library/hh872235.aspx),但是有很多限制(没有条件语句、函数调用、创建和分配变量、循环中间的增量等)阻止我使用它,所以我决定它可能不适用于我非常复杂的循环。尽管使用 Microsoft 的 #pragma loop(hint_parallel(0)) 自动并行化功能非常快,但从程序开始就自动创建了 4 个线程,每个内核一个,并且始终使用 100% 的 CPU 使用率,这是我认为最理想的——我认为它不适合我的任务。
我的程序中的每个模拟或循环都完全独立于其余部分,因为模拟结果所基于的所有变量 - 牌组中的卡片数量、2 的数量、3 的数量等 - 在模拟运行的结束,就像它们在模拟运行的开始时一样(如果每个变量和向量都没有完全按原样放回原样,则断言语句将关闭)。从最外层循环的一次迭代到下一次迭代的唯一变量是双重“预期结果”或“平均值”,出于我的目的,我想我想要每个元素(10个元素,1个用于绘制每种类型的卡片在 BlackJack 中,值 2 到 11)在最外层循环中具有自己的“预期结果” 变量或预期结果变量是由不同线程修改的原子双精度。在模拟结束时,如果有 10 个不同的线程本地“预期结果”变量,对于最初通过 ace 绘制价值 2 的牌,我希望将“预期结果”变量返回到 main 并与其他“预期结果”组合” 变量来获得最终结果 - 你的“房子边缘”。
那么我应该如何处理多线程呢?如果您处于我的位置,您会使用哪个库(库)?我可以让1个线程在循环中取第一个值,第二个线程取第二个,第三个线程取第三个,第四个线程取第四个,然后让线程#1取for循环中的第五个值循环的第一次迭代完成了吗?我应该使用固定数量的线程还是线程池(我还没有完全理解“线程池”之类的概念)?我应该制作单独的线程局部变量(expected_outcome_1、expected_outcome_2)还是应该使用带锁的东西?尽管它很复杂,但我可以在我的函数中进行自动并行化吗?
最后一件小事。我的这个程序的原始版本是递归的,其中有一个函数,经销商 Draws_Card,如果dealerScore < hard17 (|| soft16),递归 Draw_Card。递归的好处是代码比使用一堆循环更紧凑,尽管它可能更慢。我还发现捕获和修复堆栈中间的错误比嵌套循环中间的错误更难。并且循环永远不会意外地进入超深或无限递归。但是如果我想让人们阅读我的代码,大概有 15 个嵌套循环可能不会很好,所以为了清楚起见,我可能想让它尾递归,然后将递归调用优化为循环。并行化(或自动并行化)尾递归函数是否容易,就像并行化“for”一样容易?环形?因为如果是这样,我希望一起摆脱嵌套循环。