在Visual c++ 2012中并行化我的循环的有效方法是什么?其中header: php .h,



我是一个初学者,无论是在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)上给出的示例测试了微软的自动并行化和自动向量化功能,但是有许多限制(没有条件语句、函数调用、创建和分配变量、循环中间的增量等)使我无法使用它,所以我认为它可能不适用于我的非常复杂的循环。虽然使用微软的#pragma loop(hint_parallel(0))自动并行化功能非常快,从程序开始自动创建正好4个线程,每个内核一个,并且始终使用100%的CPU使用率,这是我认为理想的-我认为它不适合我的任务。

我的程序中的每个模拟或循环都完全独立于其他变量,因为模拟结果所基于的所有变量——牌组中的牌数、2张牌的数量、3张牌的数量等——在模拟运行结束时与模拟运行开始时是相同的(如果没有将每个变量和向量整齐地放回原来的位置,就会触发assert语句)。从最外层循环到下一个迭代的唯一变量是双"预期结果"或"平均值",出于我的目的,我想我希望最外层循环中的每个元素(10个元素,1个用于在BlackJack中绘制值为2到11的每种类型的纸牌)都有自己的"预期结果"变量,或者预期结果变量是由不同线程修改的原子双精度。在模拟结束时,如果有10个不同的线程局部"预期结果"变量,对于最初抽值为2到ace的卡,我希望"预期结果"变量返回到main并与其他"预期结果"变量结合以获得最终结果-您的"房屋优势"。

那么我应该如何使用多线程呢?如果你处在我的位置,你会使用哪个图书馆?我能不能让1个线程取循环中的第一个值,第二个线程取第二个值,第三个线程取第三个值,第四个线程取第四个值,然后在for循环的第一次迭代结束后,让1号线程取第五个值?我应该使用固定数量的线程,还是使用线程池(并不是说我完全理解"线程池"之类的概念)?我应该使用单独的线程局部变量(expected_outcome_1, expected_outcome_2)还是应该使用锁?尽管我的函数很复杂,但我能让自动并行化工作吗?

还有最后一件事。这个程序的原始版本是递归的,有一个函数,其中经销商Draws_Card,如果dealerScore

我有个主意。假设自动向量化是循环的(每个线程进行一次循环迭代)。创建一个期望值数组,其中10次迭代中的每一次都写入数组中它的位置,i=0到9。自动向量化循环完成后,将数组[0]中的10个值平均到数组[9]中得到结果。

检查依赖性,然后让自动矢量化器用提示完成它的工作,然后如果编译器报错,使用ivdeep强制并行化通过。

忘记自动向量化——因为如果数组值只需要初始化,然后在循环完成并除去头之后才被使用,则不需要将它们放入寄存器中。而且它很挑剔,不管怎样,如果我包含"if"语句,它就不能工作了。

没有库,或者手动将循环分割成线程。目前还没有显卡的计算使用

最新更新