草庐IT

并行机

全部标签

c++ - 选择并行化方案要考虑什么?

我正在使用C++开发一些代码,用于我在计算动力学方面的研究。我的代码求解稀疏矩阵和密集矩阵,生成网格,并在最琐碎的意义上执行类似的操作。我需要并行化我的代码以减少计算时间,并为此使用了OpenMP。但在仔细查看市售代码后,如ANSYSCFX,我发现该软件中使用的并行化方案是MPICH2,它是MPI的一种实现。所以你有很多并行化工具/API:OpenMP理工学院英特尔线程构建模块线程微软PPL我使用了其中的一些工具,并设法在我的本地计算机上使用每个工具获得100%的CPU使用率。我不知道在选择合适的并行化工具时应该注意什么标准。什么样的应用程序需要哪种工具?以上任何一项都可以用于研究目的

c++ - std::async 不并行化任务

在此代码段中使用C++11std::async:intfoo(){::sleep(2);return123;}intmain(){futurer1(async(foo));intr2=foo();cout它产生正确的结果,但连续运行两个foo(整个应用程序运行4秒)。编译为:g++-std=gnu++11-O2foo.cc-lpthread(Ubuntu12.1064位,gcc4.7.2) 最佳答案 您可能需要添加launchpolicystd::launch::async的:std::async(std::launch::asyn

c++ - CPU 内部并行化

我一直在研究Xorshift*随机数生成器,我遇到了this探索它们的属性。从该站点引用(强调我的):Howcanaxorshift64*generatorbeslowerthanaxorshift1024*generator?Dependencies.Thethreexor/shiftsofaxorshift64*generatormustbeexecutedsequentially,aseachoneisdependentontheresultofthepreviousone.Inaxorshift1024*generatortwoofthexor/shiftsarecomplet

c++ - Intel TBB 并行化开销

为什么英特尔线程构建模块(TBB)parallel_for的开销如此之大?根据Tutorial.pdf中的3.2.2AutomaticChunking部分,它大约需要半毫秒。这是教程中的一个例子:CAUTION:Typicallyaloopneedstotakeatleastamillionclockcyclesforparallel_fortoimproveitsperformance.Forexample,aloopthattakesatleast500microsecondsona2GHzprocessormightbenefitfromparallel_for.根据我目前所读到

c++ - 我应该并行化哪些循环,外部循环还是内部循环

我正在编写图像处理过滤器,我想使用openmp加快计算速度。我的伪代码结构如下:for(everypixelintheimage){//dosomestuffherefor(anycombinationofparameters){//dootherstuffhereandfilter}}代码使用不同的参数过滤每个像素,并选择最佳参数。我的问题是什么更快:在处理器之间并行化第一个循环,或者按顺序访问像素并并行化不同的参数选择。我认为这个问题可能是一个更笼统的问题:什么更快,是为每个线程提供大量操作,还是创建许多操作很少的线程。我现在不关心实现细节,我想我可以用我以前使用openmp的专业

c++ - MsBuild 并行编译和构建依赖项

我正在研究一个包含很多项目的大型C++解决方案。其中一些是构建瓶颈,其中dll依赖于另一个需要永远构建的瓶颈。我有很多CPU要构建,但我无法让MSBuild并行编译(而不是链接)所有内容并且只在链接时使用依赖项。我基本上希望在每个项目中都有:#buildobjectsmsbuild/t:BuildCompileproject.vcxproj#onlynowbuild/waitfordependenciesmsbuild/t:ResolveReferences;BuildLinkproject.vcxproj我希望以上内容作为单个构建的一部分工作(级联到相关项目)。我一直在尝试弄乱MSB

c++ - 如何并行运行多个 Qt Quick 测试?

看起来QtQuick测试需要测试窗口有一个焦点,以便发送鼠标和键盘事件。没关系,当我只运行一个测试时。但是当我尝试运行QtQuick测试的多个实例时,它们会争夺窗口焦点,这会导致测试失败。如何在不聚焦测试窗口的情况下执行QtQuick测试?是否有任何选项可以强制QtQuick使用假的鼠标和键盘事件而不是使用真实的窗口系统?如何在没有焦点问题的情况下运行QtQuick测试的多个实例? 最佳答案 好吧,我会咬。您可以使用一些C++事件发布将单个事件重定向到多个QML窗口:classDispatcher:publicQObject{Q_O

c++ - 打开 Mp 嵌套并行

所以我有两个内部平行区域的外部平行区域。是否可以将2个线程放入外部平行线,将4个线程放入每个内部平行线?我做了这样的东西,但它似乎无法按照我想要的方式工作。有什么建议吗?start_r=omp_get_wtime();omp_set_nested(1);omp_set_num_threads(2);#pragmaompparallel{printf("Thread%dexecutestheouterparallelregion\n",omp_get_thread_num());omp_set_num_threads(4);#pragmaompparellelforprivate(i,j

c++ - 并行区域中循环的 OpenMP 迭代

抱歉,如果标题不太清楚。我不太清楚怎么说。我想知道是否有任何方法可以执行以下操作:#pragmaompparallel{for(inti=0;i忽略诸如在for循环中省略私有(private)说明符之类的事情,有什么方法可以让我在外循环之外fork线程,以便我可以并行化内循环?根据我的理解(如果我错了请纠正我),所有线程都会执行外循环。我不确定内部循环的行为,但我认为for会将block分发给遇到它的每个线程。我想做的是不必fork/joiniterations次,而只是在外循环中执行一次。这是这样做的正确策略吗?如果有另一个不应并行化的外循环怎么办?那就是……#pragmaomppa

c++ - OpenMP:并行运行两个函数,每个函数占线程池的一半

我有一个CPU消耗函数do_long,我需要在两个不同的数据集上运行。do_long(data1);do_long(data2);do_long(){#pragmaompforfor(...){//doproccessing}}我有N个线程可用(取决于机器)。如何告诉OpenMP我想要do_long函数并行运行,N/2个线程应该在第一个do_long中执行循环,另一个N/2应该处理第二个do_long? 最佳答案 一种方法是使用嵌套并行来实现:voiddo_long(intthreads){#pragmaompparallelfor