草庐IT

并行机

全部标签

c++ - 使用 MATLAB 'dos' 命令调用并行化可执行文件的行为不同于独立可执行文件

当我尝试使用MATLAB的dos()命令调用并行化可执行文件时,它不会运行可执行文件并返回错误。就其本身而言,这个简单的C++程序完全按照您的预期运行:/*Serial.exe*/#includeintmain(void){std::cout结果:Apple!Banana!这个也是:/*Parallel*/#include#includeintmain(void){std::cout结果:Apple!Banana!Banana!Banana!Banana!Banana!Banana!Banana!Banana!现在,我尝试使用以下MATLAB脚本调用这两个程序:%%MATLABcall

c++ - 在并行算法中使用 ranges::view::iota

由于没有基于索引的parallelforalgorithm在c++17,我想知道ranges::view::iota可以与std::for_each结合使用模仿那个。即:usingnamespacestd;constexprintN=10'000'000;ranges::iota_viewindices(0,N);vectorv(N);for_each(execution::par_unseq,indices.begin(),indices.end(),[&](inti){v[i]=i;});iota_view似乎为适当的类型提供随机访问([range.iota.iterator]):

C++ 17 并行硬件实现

据我所知,C++17将附带Parallelism.但是,我无法理解的是它是特定的硬件并行性(默认为CPU)吗?或者它可以扩展到任何具有多个计算单元的硬件?换句话说,我们会看到诸如“nVidiaC++标准编译器”之类的东西,它会编译要在GPU上执行的并行部分吗?例如,它会是OpenCL的一些更标准化的替代品吗?注意:当然,我不是问“nVidia会那样做吗?”。我想问C++17标准是否允许这样做,以及理论上是否可行。 最佳答案 该问题提供了指向提出此更改的论文的链接,并且就并行性方面而言,所提议的内容没有实质性更改。是的,编译器可以做任

c++ - C 中 OpenMP 并行编程的性能

我从一本书中获得帮助,使用OpenMP编写了一个用于Pi计算的C程序。我相信这个程序的性能将取决于所使用的处理器。在我的例子中,我使用环境变量通过增加处理器或线程的数量来检查并行性能(我不确定什么是正确的......请纠正我)OMP_NUM_THREADS我有一个四核处理器,所以我使用了(其中no_of_threads从1更改为10):$exportOMP_NUM_THREADS=no_of_threads运行程序的性能是:1---0m11.036s2---0m5.554s3---0m3.800s4---0m3.166s5---0m3.376s8---0m3.042s10---0m2.

c++ - 在并行运行中使用 gcov 的代码覆盖率

我使用gcov为项目中的多个文件设置了C/C++代码覆盖率。可执行文件正在并行运行。这会导致一些共享代码并行运行。我收到损坏的.da文件或零大小的.da文件。这是并行运行的问题吗?因为两个或多个可执行实例正在尝试写入同一个.da文件以写入执行中每个语句的覆盖率计数?如果是这样,有什么解决方法吗?正在使用的Gcov版本是1.5 最佳答案 我有类似的需求,我通过设置GCOV_PREFIX环境变量解决了它。根据documentation:GCOV_PREFIXcontainstheprefixtoaddtotheabsolutepaths

c++ - 如何在 Skylake 架构上最大化 sqrt-heavy-loop 的指令级并行性?

为了向自己介绍x86内在函数(以及较小程度上的缓存友好性),我明确矢量化了一些用于基于RBF(径向基函数)的网格变形的代码。发现vsqrtpd是主要瓶颈后,我想知道是否/如何进一步掩盖其延迟。这是标量计算内核:for(size_ti=0;inPt是目标坐标的数量,它比nCP是源坐标/位移的数量大得多。后者适合L3,因此最内层的循环总是在源点上。第一个优化步骤是同时处理4个目标点。源点数据仍然通过标量加载然后广播访问。第二步是通过阻止循环来瞄准L1,阻止i-loop在某种程度上比阻止j-loop重要得多,j-loop只带来了微小的改进。最内层循环仍在j之上以减少负载/存储。第三是加载4个

c++ - 并行 Dijkstra 死锁

我正在使用pthreads来尝试并行化Dijkstra的寻路算法,但我遇到了一个我似乎无法弄清楚的死锁场景。它的要点是每个线程都有自己的优先级队列(一个std::multiset)和一个对应于该队列的互斥锁,该队列在需要修改时被锁定。每个节点都有一个所有者线程,它对应于节点ID模线程计数。如果一个线程正在查看一个节点的邻居并将它们的一个权重(标签)更新为比以前更低的值,它会锁定其所有者的队列并删除/重新插入(这是强制集合更新其在队列中的位置).然而,这个实现似乎陷入了僵局。我不知道为什么,因为据我所知,每个线程一次只持有一个锁。每个线程的初始队列包含它的所有节点,但是除源之外的每个节点

c++ - 并行写入数组

我有大量数据,我需要从不同线程的随机位置读取/写入这些数据。拥有一个mutex显然会降低性能。我的想法是有许多mutexes每个负责数组中的特定范围。这样,在写入之前,我可以根据要写入的数组中的索引锁定正确的mutex。理论上它可以减少比赛。但我想知道-也许有更好的方法? 最佳答案 这听起来很合理。不过,有很多事情需要考虑:您声明您的想法是拥有“许多互斥量,每个互斥量负责数组中的特定范围”。您可能应该考虑访问模式来决定如何将条目分配给互斥锁。如果线程倾向于在附近的条目上工作,您可以考虑使用不同的方案将条目分配给互斥量,例如,条目索引

c++ - C++中接口(interface)类和实现类的并行继承

我正在尝试以类似于Java接口(interface)的方式使用C++抽象基类。假设我们有以下只有纯虚函数的接口(interface)类:classShape{virtualdoublearea()=0;};classSquare:publicShape{virtualvoidsetLength(doublelength)=0;};classRectangle:publicSquare{virtualvoidsetWidth(doublewidth)=0;};我尝试通过以下方式实现Square和Rectangle:classSquareImpl:publicSquare{/*implem

c++ - openMP 没有并行线程

我的问题是我无法与openMP并行化。我的系统:Ubuntu11.4Intel(R)Core(TM)i5CPUM430@2.27GHz编译器:g++版本:4.5.2带有标志-fopenmp通过这段代码,我看到只有一个线程:intnthreads,tid,procs,maxt,inpar,dynamic,nested;//Startparallelregion#pragmaompparallelprivate(nthreads,tid){//Obtainthreadnumbertid=omp_get_thread_num();//Onlymasterthreaddoesthisif(ti