我是一个初学者,无论是在C++编程还是在Stackoverflow上,我需要让我的BlackJack优势模拟器运行得更快-理想情况下是3-4倍。它使用了1个核心和25%的i5处理器。我被所有不同的并行化循环的方法弄得不知所措,这个循环是这个程序中CPU最密集的函数的最外层的循环,它一直工作得很好,尽管速度很慢,没有并行化。我在Microsoft Visual Studio 2012上运行我的程序,我尝试了由和并发性库提供的并行for循环,但当我测试它时,任务管理器显示进程在不同数量的线程和不同数量的cpu使用量之间来回移动,并且没有像我想要的那样运行,而不是恰好获得4个线程和100%的CPU利用率。我使用( http://msdn.microsoft.com/en-us/library/hh872235.aspx )上的例子测试了微软的自动并行化和自动向量化功能,但有许多约束(没有条件语句、函数调用、创建和赋值变量、循环中间的增量等)阻止了我使用它,所以我决定它可能不适用于我非常复杂的循环。虽然使用微软的#杂注循环(hint_parallel(0))自动并行化功能非常快,但从程序一开始就自动创建了4个线程,每个核心一个线程,并且始终使用100%的CPU使用率,这是我认为是理想的--我不认为它适合我的任务。
我的程序中的每个模拟或循环都完全独立于其他模拟,因为模拟结果所基于的所有变量--牌组中的卡片数量、2的数量、3的数量等--在模拟运行结束时与模拟开始时相同(如果每个变量和向量没有整洁地放回原处,则assert语句将会失效)。从最外层循环的一次迭代到下一次迭代,唯一不同的变量是双精度“预期结果”或“均值”,出于我的目的,我认为我希望最外层循环中的每个元素(10个元素,1个用于绘制从2到11的BlackJack中的每种类型的卡片)都有自己的“预期结果”变量or,预期结果变量是由不同线程修改的原子双精度变量。在模拟结束时,如果有10个不同的线程局部“预期结果”变量,用于最初通过ace抽取值为2的牌,我希望“预期结果”变量返回到main,并与其他“预期结果”变量组合,以获得最终结果-您的“房子边缘”。
那么,我应该如何处理多线程呢?如果你处在我的位置,你会使用哪个库?是否可以让1个线程获取循环中的第一个值,第二个线程获取第二个值,第三个线程获取第三个值,第四个线程获取第四个值,然后让线程#1在循环的第一次迭代结束时获取for循环中的第五个值?我应该使用固定数量的线程,还是线程池(并不是说我完全理解“线程池”之类的概念)?我应该创建单独的线程局部变量(expected_outcome_1,expected_outcome_2),还是应该使用带有锁的东西?我能让自动并行在我的函数中工作吗,尽管它很复杂?
另外还有一件小事。我最初的这个程序版本是递归的,有一个函数,其中交易商Draws_Card,如果dealerScore < hard17 (|| soft16),递归Draw_Card。递归的好处是代码比使用一堆循环更紧凑,尽管它可能更慢。我还发现,在堆栈中间捕获和修复错误比在嵌套循环中间捕获和修复错误更难。并且循环从不会意外地进入超深度或无限递归。但如果我想让人们阅读我的代码,大约有15个嵌套循环可能不太好用,所以为了清楚起见,我可能想让它尾部递归,然后将递归调用优化到循环中。将尾递归函数并行化(或自动并行化)会像并行化"for“循环一样容易吗?因为如果是这样的话,我希望把所有的嵌套循环都去掉。
发布于 2013-04-17 03:17:06
我有个主意。假设自动向量化将是循环的(每个线程进行一次循环迭代)。创建一个期望值数组,其中10次迭代中的每一次都写入数组中的点,i=0到9。在自动向量化循环完成后,将数组中的10个值通过array9求和得到结果。
检查依赖关系,然后让自动向量器在提示下执行它的工作,如果编译器抱怨,则使用ivdep强制并行化。
忘记自动向量化-因为如果只需要初始化数组值,然后在循环完成并清除theads后留下未使用的intil,则不需要将数组值放入寄存器中。而且,如果我包含" if“语句,它就会变得很挑剔,也不会起作用。
没有库,或者手动将循环拆分成线程。并且没有图形卡的计算用途(还没有)。
https://stackoverflow.com/questions/16042546
复制相似问题