我正在研究一种递归算法,我们想要并行化以提高性能。
我使用Visual c + + 12.0和<线程>图书馆 。但是,我没有看到任何性能改进。所花费的时间要少于几毫秒,要么超过单线程的时间。
请告诉我是否做错了什么以及我应该对代码做出哪些更正。
这是我的代码
void nonRecursiveFoo(<className> &data, int first, int last)
{
//process the data between first and last index and set its value to true based on some condition
//no threads are created here
}
void recursiveFoo(<className> &data, int first, int last)
{
int partitionIndex = -1;
data[first]=true;
data[last]=true;
for (int i = first + 1; i < last; i++)
{
//some logic setting the index
If ( some condition is true)
partitionIndex = i;
}
//no dependency of partitions on one another and so can be parallelized
if( partitionIndex != -1)
{
data[partitionIndex]=true;
//assume some threadlimit
if (Commons::GetCurrentThreadCount() < Commons::GetThreadLimit())
{
std::thread t1(recursiveFoo, std::ref(data), first, index);
Commons::IncrementCurrentThreadCount();
recursiveFoo(data, partitionIndex , last);
t1.join();
}
else
{
nonRecursiveFoo(data, first, partitionIndex );
nonRecursiveFoo(data, partitionIndex , last);
}
}
}
//主
int main()
{
recursiveFoo(data,0,data.size-1);
}
//公地
std::mutex threadCountMutex;
static void Commons::IncrementCurrentThreadCount()
{
threadCountMutex.lock();
CurrentThreadCount++;
threadCountMutex.unlock();
}
static int GetCurrentThreadCount()
{
return CurrentThreadCount;
}
static void SetThreadLimit(int count)
{
ThreadLimit = count;
}
static int GetThreadLimit()
{
return ThreadLimit;
}
static int GetMinPointsPerThread()
{
return MinimumPointsPerThread;
}
答案 0 :(得分:0)
如果没有进一步的信息(见评论),这主要是猜测,但有一些事情需要注意:
ThreadLimit
作为CurrentThreadCount
实施会更有效率,在这种情况下,您不需要互斥锁。std::atomic<int>
(读取和写入访问)。否则,这是 - 严格来说 - 竞争条件,因此是UB。答案 1 :(得分:0)
通过使用t1.join
,您基本上等待其他线程完成 - 即没有并行执行任何操作。
通过查看您的算法,我不知道如何通过使用线程来并行化(从而改进) - 您必须等待单个递归调用结束。
答案 2 :(得分:0)
首先,在创建的线程完成之前,您不会并行执行任何操作,因为每个线程创建都会阻塞。因此,您的多线程代码将始终比非多线程版本慢。
为了并行化,您可以为该部分生成线程,其中调用非递归函数,将线程ID放入向量并通过遍历向量连接到递归的最高级别。 (虽然有更优雅的方法可以做到这一点,但对于第一个应该没问题,我想)。
因此,所有非递归调用都将并行运行。但是你应该使用另一个条件而不是最大线程数,但问题的大小,例如last-first<threshold
。