草庐IT

Multithreading

全部标签

c++ - 从基于线程的流水线转移到基于任务的并行? (C++)

我正在研究如何将一些现有的C++代码从基于线程的并行性迁移到基于任务的并行性,以及这种迁移是否可取。这是我的场景:假设我有一些函数要在某个事件上执行。假设我有一台相机,每次到达一帧时我都想做一些繁重的处理并保存结果。一些处理是串行的,所以如果我只是在同一个线程中串行处理每一帧,我就无法获得完整的CPU使用率。假设帧每33毫秒到达一次,并且帧的处理延迟接近100毫秒。因此,在我当前的实现中,我创建了3个处理帧的线程,并以循环方式将每个新帧分配给其中一个工作线程。所以线程T0可能会处理帧F0、F3、F6等。现在我得到了充分的CPU使用率,我不必丢帧来保持实时速率。由于处理需要各种大的、临时

c++ - 我应该在 openMP 并行区域内使用 gnu 并行模式功能吗(for 循环,任务)

我有一个由openMP加速的程序,在并行区域内,函数如std::nth_element、std::sort、std::partition被调用。实际上,这些函数用于处理每个openmp-thread对应的数组部分。最近,我发现g++实现了上述函数的并行版本,所以我想知道我应该在#pragmaomptask中使用像__gnu_parallel::nth_element这样的函数还是#pragmaomp用于区域?如果我使用并行模式,线程总数是否会超过omp_set_num_threads()设置的限制并导致更差的加速? 最佳答案 简单(

c++ - OpenMP 并行代码与串行代码的输出不同

我不得不更改和扩展我的算法以进行一些信号分析(使用polyfilterbank技术)并且不能使用我的旧OpenMP代码,但是在新代码中结果并不像预期的那样(结果在开始位置与串行运行相比,该数组在某种程度上是不正确的[串行代码显示预期结果])。所以在第一个循环tFFTin中,我有一些FFT数据,我将其与窗口函数相乘。目标是一个线程为每个多相因子运行内部循环。为了避免锁定,我使用了reductionpragma(没有复杂的reduction是标准定义的,所以我使用我的那个,其中每个线程的omp_priv变量都用omp_orig[所以用tFFTin]初始化)。我使用有序pragma的原因是结

C++ 独立数据的多线程性能

让我们创建一个只有一个数据成员的非常简单的C++类:classContainer{public:std::vectorelements;Container(intelemCount);};现在创建N个线程来完成一个非常简单的任务:创建一个具有特定vector大小的本地Container遍历vector并简单地增加每个元素的val重复步骤210.000次(以秒而不是毫秒为单位获取时间)完整的代码list可以在Pastebin上找到根据CoreInfo我的CPU(IntelCorei52400)有4个内核,每个内核都有自己的L1/L2缓存:LogicaltoPhysicalProcesso

c++ - 父不等待工作线程完成任务

在我的程序中,主线程创建了4个(或更多)工作线程。在某些时候,父线程(主线程)必须等待worker才能完成一些计算。线程在无限循环中运行,所以我不能使用pthread_join(..,..)POSIX函数来等待工作人员完成。所以我使用了一个全局计数器和一个条件变量。主线程代码unsignedjobs=0;//globalvariable//globalmutexandcv.Theygetinitialisedinmymain.pthread_mutex_tcounter_mutex;pthread_cond_tcounter_cv;staticvoidprocess(..){jobs=

c++ - 使用条件变量(监视器)同步线程

我需要同步多个线程(使用POSIX线程)。此外,我正在使用条件变量(监视器)来实现这一点。问题是我必须实现“先到先得”的策略。假设多个线程正在等待另一个线程发出条件变化的信号,pthread_cond_wait是否调用将线程本身放入队列中,还是我应该定义一个显式队列来实现这一点?一个可能的解决方案也可能是使用锁。 最佳答案 PthreadsAPI不保证pthread_cond_wait+pthread_cond_signal/pthread_cond_broadcast组合的公平性。spec明确指出调度策略将决定等待线程唤醒的顺序:

c++ - OpenMP:为什么这个应用程序有时会扩展?

我正在尝试在Intel®Core™i5-6500CPU@3.20GHz×4上使用OpenMP加速OpenCVSIFT算法.您可以在sift.cpp中找到代码.最昂贵的部分是描述符计算,特别是:staticvoidcalcDescriptors(conststd::vector&gpyr,conststd::vector&keypoints,Mat&descriptors,intnOctaveLayers,intfirstOctave){intd=SIFT_DESCR_WIDTH,n=SIFT_DESCR_HIST_BINS;for(size_ti=0;i=firstOctave&&la

c++ - std::thread 在使用参数创建时抛出访问冲突异常?

关闭。这个问题需要debuggingdetails.它目前不接受答案。编辑问题以包含desiredbehavior,aspecificproblemorerror,andtheshortestcodenecessarytoreproducetheproblem.这将有助于其他人回答问题。关闭6年前。Improvethisquestion我正在使用VS2015,在使用std::thread时遇到一个非常奇怪的问题。voidKlass::myfunc(inta,intb){std::cout它在Debug模式下运行良好,但当我转到Release模式时抛出“访问冲突异常”。此外,如果我尝试将

c++ - 对于短共享操作和少数独特操作,是否有任何共享互斥锁的方法?

众所周知,std::shared_timed_mutex(C++14)和std::shared_mutex(C++17)比std有性能优势::mutex仅适用于很长的std::shared_locks(读操作),当std::shared_locks超过std::unique_lock。但即使它的大部分是读操作,而且它们很短,std::mutex也会更快——这就是为什么在C++11标准中std::shared_mutex和std::shared_timed_mutex没有立即包含在内。是否有某种共享互斥体的任何方法或实现,它比std::mutex具有性能优势,也对于短操作,如果读取不只是

c++ - 跨内核线程迁移后是否可以强制重新加载 thread_local 变量?

我在内核和线程之上实现用户线程并观察到,当用户线程在内核线程之间迁移时,thread_local变量会从先前的内核位置读取,即使变量也被标记作为volatile。由于编译器仅将用户级swapcontext视为函数调用,因此下面的示例演示了简单函数调用的问题。#includestructFoo{intx;inty;};__threadFoo*volatilefoo;voidbar(){asm("nop");}voidf(){foo->x=5;bar();asmvolatile("":::"memory");//Wedesireasecondcomputationoftheaddresso