如何提高使用Barriers的C ++ pthread代码的时间性能

时间:2015-08-28 10:35:54

标签: c++ pthreads

我写了一个用于模拟通信系统的代码。在这个通信系统中,有一个部分是我使用pthreads并行运行的。它基本上纠正了由通道引起的错误。

当我收到一个比特帧时,算法的3个分量在比特上运行。通常,它们一个接一个地运行,这样可以获得最佳性能,但是会有很大的延迟。

这个想法是让它们并行运行。但是为了获得最佳性能,3个组件可以同时处理每个位。

如果我只是并行运行它们会得到不好的结果,但速度非常快。所以我使用了障碍来同步进程,其中每个位由三个组件处理,然后允许它们跳转到下一位。

此方法的性能是最佳的。但代码运行速度非常慢,我的速度甚至比串行实现慢。

代码在Ubuntu上运行,带有GCC编译器。

编辑:还有一个问题,线程是否在等待屏障打开时进入睡眠状态?如果是这样,我该如何阻止他们这样做?

2 个答案:

答案 0 :(得分:2)

如果你真的必须在每个之后进行同步,那么非常简单的线程不是一种合适的方法。同步开销将远远超过计算成本,因此最好在单个线程中完成。

你可以将工作分成更高的水平吗?例如,让整个帧由单个线程处理,但是并行处理多个帧?

答案 1 :(得分:1)

这是一个可能的解决方案,使用NO MUTEX。

假设您有4个线程:主线程读取一些输入,其他3个线程按块处理其块。一个线程可以在上一个完成处理之后处理一个块。

所以你有一个块的数据类型:

class chunk{
 byte buffer[CHUNK_SIZE];
 char status; // use char for atomic input, c++11 can use std::atomic_int.
public: 
 chunk():status(0); 
};

你有一个块列表:

std::list<chunk> chunks;

所有线程在块上运行,直到它们到达列表的末尾,但等到状态达到一个条件,当输入块完成时,主线程将状态设置为1。第一个线程等待状态为1,表示输入完成,完成后设置状态为2,线程2等待状态为2表示线程1完成,处理完该块后,将状态设置为3,依此类推。最后,主线程等到状态为4才能得到结果

设置状态时很重要,使用=而非++使其尽可能原子化。