OpenMP:如何在任务中实现线程本地对象?

     2023-02-22     183

关键词:

【中文标题】OpenMP:如何在任务中实现线程本地对象?【英文标题】:OpenMP: how to realize thread local object in task? 【发布时间】:2020-07-30 08:49:00 【问题描述】:

我要做的是并行迭代容器的所有元素,类似于#pragma omp for;但是,有问题的容器不提供随机访问迭代器。因此,我通过this *** answer 中描述的任务使用解决方法:

for (std::map<A,B>::iterator it = my_map.begin();
        it != my_map.end();
        ++it)       

   #pragma omp task
    /* do work with  it   */  

我的问题是每次迭代都需要一个“暂存空间”对象;这个对象在构建或复制到任务的数据环境中是昂贵的。每个线程只需要一个线程本地对象;从某种意义上说,每个任务都使用执行它的线程的对象private 需要一个副本,shared 导致竞争条件。 有没有办法通过 OpenMP 实现这一点?

我研究了#pragma omp threadprivate,但是对象不是静态的,因为程序的结构看起来像这样:

method(int argument_for_scratch_object)
   #pragma omp parallel
   
      Object scratch(argument_for_scratch_object);

      //some computations are done here...
   
      #pragma omp single nowait
      
         //here goes the for loop creating the tasks above
         //each task uses the scratch space object
      
   

如果scratch在并行区域之前被声明为静态(然后变为threadprivate),它将使用第一个方法调用的argument_for_scratch_object进行初始化;这对于后续的方法调用可能不正确。

【问题讨论】:

#pragma omp threadprivate 确实是您想要的。至于“对象不是静态的”——为什么?然后,将它们设为静态。 我相信threadprivate 变量必须是全局(文件范围)或块范围内的静态或静态类成员。非静态 threadprivate 块范围变量对我来说没有太大意义。请记住,threadprivate 是变量定义时的属性,而不是打开并行作用域时的数据共享属性。如需完整答案,请描述您使用/管理 scratch space 对象以及为什么不能选择静态或全局对象。 感谢您的 cmets @DanielLangr 和 @Zulan!澄清一下:所有这些都发生在一个方法中,暂存空间对象构造函数需要该方法的一个参数。如果我将暂存空间对象设为静态,则在随后的方法调用中可能不正确。 (希望我理解正确,如果这是初学者的误解,我深表歉意) 【参考方案1】:

根据您的更新,我建议使用全局/静态线程私有指针,然后由并行部分中的每个线程对其进行初始化。

static Object* scratch_ptr;
#pragma omp threadprivate(scratch_ptr);

void method(int argument_for_scratch_object)

#pragma omp parallel
  
    scratch_ptr = new Object(argument_for_scratch_object);
    ...
    delete scratch_ptr;  
  

【讨论】:

如何在java中实现跨线程的通讯

...多线程来共同完成一个任务,这就牵扯到线程间的通讯。如何让两个线程先后执行?Thread.join方法privatestaticvoiddemo2(){ThreadA=newThread(newRunnable(){@Overridepublicvoidrun(){printNumber("A");}});ThreadB 查看详情

OpenMP C++ 中的线程

】OpenMPC++中的线程【英文标题】:ThreadsinOpenMPC++【发布时间】:2011-01-0719:26:47【问题描述】:我需要在C++OpenMP中实现C#线程效果..Threadt=newThread(func1);t.Start();//Dosomething//Dosomethingelse请注意,父母或孩子都没有等待加入..我可以在C++O... 查看详情

如何在 Swift 中实现线程安全的 HashTable (PhoneBook) 数据结构?

】如何在Swift中实现线程安全的HashTable(PhoneBook)数据结构?【英文标题】:HowtoimplementaThreadSafeHashTable(PhoneBook)DataStructureinSwift?【发布时间】:2018-08-1214:32:48【问题描述】:我正在尝试实现一个线程安全的电话簿对象。电话簿应该... 查看详情

Java varargs 是如何在内存中实现的

】Javavarargs是如何在内存中实现的【英文标题】:HowareJavavarargsimplementedinthememory【发布时间】:2019-01-1108:32:56【问题描述】:据我所知,本地变量和参数存储在堆栈内存中,其中包括对象引用,而实际对象存储在堆内存中。那么... 查看详情

如何在 Spring Boot 中实现 Camunda SendTask

】如何在SpringBoot中实现CamundaSendTask【英文标题】:HowtoimplementCamundaSendTaskinSpringBoot【发布时间】:2020-10-0914:06:21【问题描述】:我是Camunda的新手,正在使用以下任务:业务规则任务-->(网关)-->发送任务-->用户任务在使... 查看详情

如何在 Hammerspoon 初始化中实现周期性任务?

】如何在Hammerspoon初始化中实现周期性任务?【英文标题】:HowtoimplementperiodictaskinHammerspooninitialization?【发布时间】:2020-09-1221:56:18【问题描述】:我认为当我的网络连接中断或恢复时收到通知会很棒,所以我把它放在我的Hammers... 查看详情

如何在 C# 中实现线程关联?

】如何在C#中实现线程关联?【英文标题】:HowdoIimplementthreadaffinityinC#?【发布时间】:2017-12-1422:09:33【问题描述】:我有一个需要线程关联的第三方API。我在我的服务应用程序中使用WCF来处理来自客户端的请求,然后将这些请求... 查看详情

如何在一个类中实现异步

...多开发者受益。那么回到最初的地方,传统的前端开发中如何实现异步编程呢?下面列举了js实现异步编程的四种方式。方法一:使用回调函数方法二:事件监听可以定义一个事件,并为这个事件设定处理函数。这样只有当这个... 查看详情

如何在Java中实现多个线程来下载单个表数据?

】如何在Java中实现多个线程来下载单个表数据?【英文标题】:HowtoimplementseveralthreadsinJavafordownloadingasingletabledata?【发布时间】:2012-01-0916:15:07【问题描述】:如何实现多个线程的多个/相同连接,以便快速下载单个大表数据。... 查看详情

如何在Java中实现多个线程来下载单个表数据?

】如何在Java中实现多个线程来下载单个表数据?【英文标题】:HowtoimplementseveralthreadsinJavafordownloadingasingletabledata?【发布时间】:2012-01-0916:15:07【问题描述】:如何实现多个线程的多个/相同连接,以便快速下载单个大表数据。... 查看详情

利用argument对象在javascript中实现重载(overload)

...时:一项任务,根据不同的参数,执行不同的操作流程时如何:js语法不支持重载效果变通:所有函数对象内,都自动内建了一个其功能实现情况如下:functionpay(){console.log("微信支付");}fu 查看详情

如何在头文件C++中实现类对象

】如何在头文件C++中实现类对象【英文标题】:HowtoimplementclassobjectsinheaderfileC++【发布时间】:2019-07-2406:12:47【问题描述】:如何在头文件中实现类对象,以便每次包含头文件时,都可以访问cpp文件中的对象?这是我现在的代码... 查看详情

如何获得在整个程序执行期间可能创建的最大 OpenMP 线程数?

】如何获得在整个程序执行期间可能创建的最大OpenMP线程数?【英文标题】:HowcanIgetthemaximumnumberofOpenMPthreadsthatmaybecreatedduringthewholeexecutionoftheprogram?【发布时间】:2016-05-1818:35:37【问题描述】:我想创建一个全局对象数组(OpenMP... 查看详情

如何使用对象列表在片段中实现newinstace模式[重复]

】如何使用对象列表在片段中实现newinstace模式[重复]【英文标题】:Howtoimplementnewinstacepatternsinthefragmentusingalistofobjects[duplicate]【发布时间】:2018-01-1005:15:26【问题描述】:如何将在改造2的活动中检索到的对象列表传递给使用新... 查看详情

如何在 Fragment 中实现 Google Maps 并使用 GoogleMap 对象?

】如何在Fragment中实现GoogleMaps并使用GoogleMap对象?【英文标题】:HowtoimplementGoogleMapswithinaFragmentandusetheGoogleMapobject?【发布时间】:2015-01-0722:04:54【问题描述】:如何在Fragment中实现GoogleMap?我正在尝试开发相同的东西,但是getMap... 查看详情

如何在teams中实现审批任务(代码片段)

... 正文  先睹为快,我们先看看效果,再看看如何去操作!  这样,我们就可以通过在Teams中点击审批、拒绝,当然࿰ 查看详情

如何在 .NET 中实现夜间进程?

】如何在.NET中实现夜间进程?【英文标题】:Howtoimplementanightlyprocessin.NET?【发布时间】:2011-06-2008:00:30【问题描述】:我有一组任务,我想每天晚上执行。这些任务依次包括查询数据库、移动然后重命名一些图像以及更新数据... 查看详情

如何在 Java 中实现包装装饰器?

】如何在Java中实现包装装饰器?【英文标题】:HowtoimplementawrapperdecoratorinJava?【发布时间】:2016-04-0807:20:35【问题描述】:问题是创建现有对象的动态增强版本。我无法修改对象的Class。相反,我必须:子类化它将现有对象包装... 查看详情