jjzjj

c++ - 打开 : check if nested parallesim

假设我有一个方法将两个std::vector相乘:doublemultiply(std::vectorconst&a,std::vectorconst&b){doubletmp(0);/*hereIcouldeasilydoaparallelizationwith*//*#pragmaompparallelloopfor*/for(unsignedinti=0;i如果我在此函数中设置pragma宏,将运行对multiply(...)的调用在所有线程上。现在假设我想在其他地方做很多vector乘法:voidmany_multiplication(std::vector*a,std::ve

c++ - openMP 的 SIMD 构造是否需要特定类型的硬件?

https://bisqwit.iki.fi/story/howto/openmp/Thesimdconstruct(OpenMP4.0+)OpenMP4.0addedexplicitSIMDparallelism(Single-Instruction,Multiple-Data).SIMDmeansthatmultiplecalculationswillbeperformedsimultaneouslybytheprocessor,usingspecialinstructionsthatperformthesamecalculationtomultiplevaluesatonce.T

c++ - boost RNG 的线程安全

我有一个循环,应该通过插入一个openmppragma很好地并行化:boost::normal_distributionddist(0,pow(retention,i-1));boost::variate_generatordgen(rng,ddist);//Diamondconststd::uint_fast32_tdno=1(除非我出错,否则每次执行完全不依赖于其他执行。抱歉,并非所有代码都被插入)。但是我的问题是-boostRNG是线程安全的吗?他们似乎为gcc引用了gcc代码,因此即使gcc代码是线程安全的,但对于其他平台可能并非如此。 最佳答案

c++ - pi 计算的 OpenMP 并行化速度慢或错误

我在并行化我的蒙特卡洛方法来计算圆周率时遇到了问题。这是并行化的for循环:#pragmaompparallelforprivate(i,x,y)schedule(static)reduction(+:count)for(i=0;i问题是,如果我使用schedule(static),它会低估pi,如果我使用schedule(dynamic),它会比串行实现慢。我究竟做错了什么?我尝试了其他方法来修复它(例如:UsingOpenMPtocalculatethevalueofPI),但它仍然比串行实现慢得多。提前致谢 最佳答案 假设您正

c++ - OpenMP - 在每个循环迭代中启动一个新线程

我很难调整自己的想法以适应OpenMP的做事方式。大致来说,我想要的是:for(inti=0;i我想我知道这在c++11中是如何完成的,但我需要能够使用OpenMP完成类似的事情。 最佳答案 最接近您想要的是OpenMP任务,可在OpenMPv3.0和更高版本的兼容编译器中使用。它是这样的:#pragmaompparallel{#pragmaompsinglefor(inti=0;i此代码将使循环仅在一个线程中执行,并将创建50个OpenMP任务,这些任务将使用不同的参数调用callback()。然后它将在退出并行区域之前等待所有任

c++ - OpenMP 和 C++ 并行 for 循环 : why does my code slow down when using OpenMP?

我有一个关于使用OpenMP(与C++)的简单问题,我希望有人能帮助我。我在下面提供了一个小示例来说明我的问题。#include#include#include#includeusingnamespacestd;intmain(){srand(time(NULL));//Seedrandomnumbergeneratorvectorv;//Createvectortoholdrandomnumbersininterval[0,9]vectord(10,0);//Vectortoholdcountsofeachintegerinitializedto0for(inti=0;i::iter

c++ - 部分和 OpenMP 代码有时会挂起

我有这段代码使用OpenMP和C++。代码正确执行但有时会挂起。我正在使用部分。你能告诉我问题是什么吗?我尝试了几件事,但都没有奏效,比如将变量从私有(private)更改为共享。#include#include#include#defineN50//gcc-fopenmp-oe3e3.cintmain(intargc,char*argv[]){inti,nthreads,tid,section;floata[N],b[N],c[N];voidprint_results(floatarray[N],inttid,intsection);/*Someinitializations*/fo

c++ - 是否可以并行化这个 for 循环?

我得到了一些使用OpenMP进行并行化的代码,在各种函数调用中,我注意到这个for循环在计算时间上有一些好处。doubleU[n][n];doubleL[n][n];doubleAprime[n][n];for(i=0;i=i){doubles;s=0;for(k=0;k然而,在尝试将其并行化并在各处应用一些信号量之后(没有运气),我开始意识到elseif条件对早期的有很强的依赖性if(L[j][i]是一个用U[i][i]处理过的数字,可以在早期的if),在我看来,由于竞争条件,它是不可并行化的。是否可以并行化此代码,使elseif仅在较早的if已经完成时执行?

c++ - OpenMP 开销计算

给定n个线程,有没有一种方法可以计算在OpenMP中实现特定指令所需的开销量(例如周期数)。例如,给出下面的代码#pragmaompparallel{#pragmaompforfor(inti=0;i我能以某种方式计算出创建这些线程需要多少开销吗? 最佳答案 我认为衡量开销的方法是对串行和并行版本进行计时,然后查看并行版本与其线程数的“理想”运行时间相差多远。因此,例如,如果您的串行版本需要10秒,并且您在4个内核上有4个线程,那么您理想的运行时间是2.5秒。如果您的OpenMP版本需要4秒,那么您的“开销”就是1.5秒。我将开销放

c++ - 为什么 OpenMP 程序只在一个线程中运行

我刚刚用一个简单的c程序尝试了OpenMPtest(){for(inti=0;i使用g++-fopenmp编译。它可以正确打印出我有4个CPU,但所有测试函数都在thread0上运行。我试图修改OMP_NUM_THREADS。但它也没有效果。我拥有与在线示例相同的所有内容,但为什么我不能让它工作? 最佳答案 你的问题在这里:#pragmaompparallelfornum_thread(4)正确的子句是num_threads(4),而不是num_thread(4)。不正确的openmppragma将被忽略,因此您最终得到了一个顺序程