我是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自动并行化和自动矢量化功能,但是有很多限制(没有条件语句,函数调用,创建和分配变量,在循环中间进行增量操作等)使我无法使用它,因此我决定对于我非常复杂的循环可能无法解决。 尽管使用Microsoft的#pragma loop(hint_parallel(0))自动并行化功能非常快,但它从程序开始就自动创建了4个线程,每个内核一个线程,并始终使用100%的CPU使用率,我认为这是理想的选择-我认为这不适合我的任务。

在我的程序中,每个模拟或循环都完全独立于其余部分,因为模拟结果所基于的所有变量-牌组中的牌数,2的数量,3的数量等-相同在模拟运行结束时,就像在模拟运行开始时一样(如果每个变量和向量未完全按原样放回原处,则assert语句将消失)。 与最外层循环的一次迭代与下一次循环不同的唯一变量是双倍的“预期结果”或“平均值”,出于我的目的,我想我希望每个元素(10个元素,其中1个用于绘制每种类型的卡在BlackJack的值2到11中)在最外层的循环中具有其自己的“预期结果”变量,或将预期结果变量设置为由不同线程修改的原子双精度。 在模拟结束时,如果有10个不同的线程局部“预期结果”变量,那么对于最初通过ace获得两张价值2的卡,我希望将该“预期结果”变量返回给main并与其他“预期结果”组合以获得最终结果的变量-您的“房子优势”。

那么我应该如何进行多线程处理呢? 如果您处于我的位置,您将使用哪个图书馆(图书馆)? 我可以让一个线程在循环中获取第一个值,第二个线程获取第二个值,第三个线程获取第三个值,第四个线程获取第四个值,然后让#1线程在for循环中获取第一个值循环的第一次迭代完成了吗? 我应该使用固定数量的线程还是线程池(不是我完全理解“线程池”之类的概念)? 我应该创建单独的线程局部变量(expected_outcome_1,expected_outcome_2)还是使用带锁的东西? 尽管函数很复杂,我仍可以在函数中使用自动并行化吗?

最后一件事。 该程序的原始版本是递归的,具有发牌人Draws_Card的功能,并且如果DealerScore <hard17(|| soft16),则递归Draw_Card。 关于递归的好处是,尽管使用了一些循环,但代码比使用一堆循环更紧凑。 我还发现,比嵌套循环中间的错误更难捕获和修复堆栈中间的错误。 而且循环永远不会意外地进入超深度或无限递归。 但是,如果我希望人们阅读我的代码,则大约有15个嵌套循环可能不太理想,因此我可能想使其尾部递归以保持清晰,然后将递归调用优化为循环。 并行化(或自动并行化)尾部递归函数是否像并行化“ for”循环一样容易? 因为如果是这样,我希望摆脱所有嵌套循环。

===============>>#1 票数:0

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

检查相关性,然后让自动矢量化器通过提示来完成其工作,然后在编译器抱怨时使用ivdep强制并行化。

不用担心自动矢量化-因为如果只需要初始化数组值,然后在循环完成并删除theats之后将其闲置使用,则无需将数组值放入寄存器。 而且它很挑剔,而且无论如何,如果我包含“ if”语句,它将不起作用。

无需库,也无需手动将循环拆分为线程。 而且还没有图形卡的计算用途。

  ask by translate from so

未解决问题?本站智能推荐:

2回复

如何使用std :: accumulate对由单独定义的索引指向的向量中的值进行整齐求和(替换循环)

我想知道是否有一个整体(或更好,更有效),矢量/(不对称)矩阵的值的总和方法(具有对称结构的矩阵,当然可以在循环中被利用,但不是与我的相关)问题)由一系列指数指出。 基本上,此代码可用于计算通过2D矩阵的路线的成本。 我正在寻找一种利用CPU的方法,而不是GPU。 这是一些相关的代码,
3回复

如何有效地并行化分而治之算法?

过去几天我一直在清理我对排序算法的记忆,而且我遇到了一个我无法找到最佳解决方案的情况。 我写了一个quicksort的基本实现,我想通过并行执行来提高性能。 我得到的是: 虽然这比天真的“无线程”实现更好,但这具有严重的局限性,即: 如果要排序的数组太大或者递归太深
2回复

C ++ 11并行化:Armadillo的set_seed_random()的瓶颈

在C ++ 11中,使用arma_rng::set_seed_random()产生瓶颈。 我展示了一种重现它的方法。 考虑以下简单代码: 我用 当我在终端中运行可执行文件时,我看到其中一个内核正在以接近100%的CPU%处理它。 如果我运行它的更多实例,则会减少每个相应
1回复

VC OpenMP嵌套并行循环奇怪的结果

VC ++,测试OpenMP并行性是否有嵌套循环,但结果却很奇怪: 没有性能提升 对于大循环,SUM计算是错误的。 如果只有5个嵌套循环,就可以了。 结果如下: 这是工作代码:
1回复

并行化for循环并合并线程私有变量

我对如何使用OpenMP多线程来并行化此for循环即时消息感到困惑。 在程序的该程序部分中,我尝试从数组x和y接收数据。 定义为: 其中n是一个大于0的整数,可以被16整除,然后将最大/最小x / y值保存在向量maxX,minX,minY和maxY中。 n可以尽可能大,但是在测试时我的n为3
3回复

并行化非常紧密的循环

我已经在这个问题上花了好几个小时的脑袋而且我总是因为线程争用而吃掉了并行化循环的性能改进。 我正在尝试计算8位灰度千兆像素图像的直方图。 读过“CUDA by example”一书的人可能会知道它的来源(第9章)。 该方法非常简单(导致非常紧凑的循环)。 它基本上就是这样
1回复

是否可以并行化或展开此循环?

我正在尝试查看是否可以提高C ++中以下循环的性能,C ++使用二维向量(_external和_Table),并且对先前的迭代具有循环依赖关系。 此外,它在最内层的循环中具有计算出的索引访问器,这将使_Table的访问在右侧不连续。 我该怎么做才能改善这样的循环性能?
1回复

有关C ++中并行线程的一般问题

我以前没有在程序中使用线程。 但是此第三方应用程序存在一个问题。 这是一个异地备份解决方案,它具有一台服务器和许多客户端。 我们有一个管理控制台来管理所有客户端,这就是问题所在。 如果客户端应用程序之一卡住或在损坏的状态下运行,则管理控制台将永远等待以获取响应,并且不显示任何内容
1回复

使用OpenMP并行化C ++代码不会提高性能

我编写了一个计算一些数字的C ++代码。 我正在尝试使用OpenMP库对其进行并行化。 它具有3个嵌套的for循环,而并行化的一个是外部循环。 我使用G ++编译器在Linux上工作。 该代码可以工作,但是问题是并行化并未影响性能。 在我的双核笔记本电脑(具有多线程功能的intel i
2回复

使用OPENMP进行并行合并排序

我有一个书面的顺序合并排序程序,如下所示: 现在,我想并行化此代码(C中用于并行化的API是OPENMP)。 你能帮助我吗? 基本上,我使用#pragma parallel num_thread(4),但是我不知道是否应该包括其他任何东西以便进行并行化。