草庐IT

并行课程

全部标签

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

C++ 并行 std::vector 排序与昂贵的复制

假设我有一个vectorintVec和一个vector>matrix.我想排序intVec并对matrix的第一个维度重新排序相应地在C++中。我意识到这个问题之前已经被问过好几次了,但是这个案例有一个转折。vector复制起来很昂贵,所以例如复制intVec和matrix到vector>,对其进行排序并将它们复制回去比平时效率更低。如果没有滚动我自己的自定义排序算法,我该如何排序intVec并对matrix的第一个维度重新排序在不复制matrix的任何元素的情况下同步并调用vector的拷贝构造函数? 最佳答案 Avectoris

c++ - 在并行 omp 循环中同时写入同一内​​存

我想实现以下函数,将数组的某些元素标记为1。voidmark(std::vector&marker){#pragmaompparallelforschedule(dynamic,M)for(inti=0;i如果我们尝试在不同的线程中同时将同一个元素的值设置为1会发生什么?它通常会设置为1还是此循环可能会导致意外行为? 最佳答案 Thisanswer一个基本部分是错误的(强调我的):Ifyouwritewithdifferentthreadstotheverysamelocation,yougetaracecondition.This

c++ - 并行操作 std::vector 的不同元素

假设我有一个std::vector.vector很大(>1000个元素)并且每个Object*需要对其进行大量计算。然后在每个元素上运行每个计算的for循环可以很容易地并行化。事实上,我可以并行处理所有1000个元素以获得最大加速(“令人尴尬的并行?”)现在我想知道两件事:1)读写std::vector的不同元素是否安全没有锁?(不是修改vector本身!)2)是否有简单的方法或约定或模式可以遵循来切断for循环并分派(dispatch)给线程? 最佳答案 1)是2)您可以使用OpenMP来并行处理vector。如果您使用的是Mic

c++ - openMP - 与 for 循环和私有(private)并行化

我编写了一个函数来评估集合(set_)中的点处的给定函数。没有并行化的代码是这样的:voidMethod::evaluateSet(double*funcEvals_,double**set_){for(intj=0;j这一切正常。然后我使用openMP进行并行化,使用并行构造,并为每个线程提供变量set_的私有(private)拷贝。循环是#pragmaompparallelforprivate(set_)for(intj=0;j它崩溃,并且在if评估时发生错误,set_isbeingusedwithoutbeeninitialized。我不明白。由于我将set_变量设置为私有(pr

并行计算与大规模数据处理:Hadoop与Spark

1.背景介绍大数据是指由于互联网、物联网等新兴技术的发展,数据量巨大、高速增长、多源性、不断变化的数据。大数据处理技术是指利用计算机科学技术,对大规模、高速、多源、不断变化的数据进行存储、处理和挖掘,以实现数据的价值化。并行计算是指同时处理多个任务或数据,以提高计算效率。大规模数据处理是指处理的数据量非常大,需要借助分布式系统来完成。Hadoop和Spark是两种常用的大规模数据处理技术,Hadoop是一个开源的分布式文件系统(HDFS)和分布式计算框架(MapReduce)的集合,而Spark是一个基于内存计算的大数据处理框架,它可以在HDFS、本地文件系统和其他分布式存储系统上运行。本文将

c++ - 用于基于任务的并行性的通用 c++11 函数包装器

我正在实现一个工作窃取算法,并正在编写一个通用函数包装器,它将promise作为包装器模板的可变参数之一。我想使用这些函数包装器创建任务,并让每个节点使用promise与依赖节点进行通信。每个节点都维护一个依赖节点和promise/future的列表。每个节点都可以通过检查是否已设置所有future来运行。promises可以根据函数包装器正在返回不同对象的工作而有所不同。如果可以将单个算法分解为单独的操作,例如读取消息和解码消息、对对象执行检查、返回所有检查的结果,则这些操作中的每一个都将返回不同的promise(对象、bool值、结果)。C++ConcurrencyinAction

c++ - 私有(private)子句中的变量与 OpenMP 中并行区域中定义的变量之间有什么区别吗?

我想知道是否有任何理由更喜欢OpenMP中的private(var)子句而不是(私有(private))变量的本地定义,即intvar;#pragmaompparallelprivate(var){...}对比#pragmaompparallel{intvar;...}此外,我想知道私有(private)子句的意义何在。OpenMP:arelocalvariablesautomaticallyprivate?部分解释了这个问题,但我不喜欢这个答案,因为即使C89也不禁止您在函数中间定义变量,只要它们在作用域的开头(当您进入并行区域时会自动出现这种情况)。因此,即使对于老派的C程序员来说

AlarmManager没有及时执行课程?

在我的项目中,我想每天在特定时间更改共享式汇率中的标志值,我已经实现了警报器,但没有执行任务。我打电话给我的接收器课程的功能:publicvoidchangeAttendaceFlag(){Log.d(TAG,"changeAttendaceFlag!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");Calendarcalendar=Calendar.getInstance();calendar.set(Calendar.HOUR_OF_DAY,14);calendar.set(Calendar.MINUTE,23);calendar.set(Calendar.SECOND,