C++ 并行化QuickHull:OpenMP提供较小的加速比,而TBB提供负加速比
当涉及到使用OpenMP和TBB的共享内存编程时,我是一个初学者 我正在实现QuickHull算法()的并行版本,以查找一组数据点的凸包。() 基本上可以并行完成以下任务:C++ 并行化QuickHull:OpenMP提供较小的加速比,而TBB提供负加速比,c++,parallel-processing,openmp,tbb,C++,Parallel Processing,Openmp,Tbb,当涉及到使用OpenMP和TBB的共享内存编程时,我是一个初学者 我正在实现QuickHull算法()的并行版本,以查找一组数据点的凸包。() 基本上可以并行完成以下任务: 找到最左边和最右边的点(P和Q) 根据这两个点(P和Q)的线连接拆分整个数据集 对于这两个集合中的每一个,获取距离上次拆分发生的线(PQ)最远的点 根据最远点(C)将数据分为两组:一组包含线PC右侧的所有元素,另一组包含线QC右侧的所有元素 注意,第3部分和第4部分是递归完成的,直到每个子集都为空 首先,我已经使用OpenM
#pragma omp parallel for…
。但我个人认为我做错了什么,因为加速从未超过2倍。其次,为了比较加速比,我还使用Intel TBB进行了一个实现,这导致了负加速比(即使对于大型数据集)。使用TBB,我同时使用了TBB::parallel_for()和TBB::parallel_reduce()
基本上,我的问题可以分为两部分:
1) OpenMP实现
2) TBB实施
第一部分
正如在下面的基准测试中所看到的,当我的数据集的大小增加时,当使用足够的线程时,速度也会加快
请注意,加速比没有超过2x,我个人认为这对这个算法来说是非常糟糕的,因为很大一部分是可并行的。以下是相关代码:
void ompfindHull(点向量和输入、点*p1、点*p2、点向量和输出){
//如果集合中没有点…请停止。这是递归的停止条件。:)
if(input.empty()| | input.size()==0)返回;
int num_threads=omp_get_max_threads();
//获取距离p1-p2段最远的点
点**最远的子节点=新点*[num_线程];
double**distance_sub=新的double*[num_threads];
int-thread_-id;
#pragma omp并行专用(线程id)
{
thread_id=omp_get_thread_num();
最远的子线程[线程id]=输入[0];
距离_sub[thread_id]=新双精度(0);
#pragma omp for
对于(int index=1;indexx-a->x)*(a->y-c->y))-((b->y-a->y)*(a->x-c->x));
距离=距离>=0?距离:-距离;
双cur_distance=*distance_sub[thread_id];
if(电流距离<距离){
最远的子线程[线程id]=输入[索引];
距离_sub[螺纹_id]=新的双圈(距离);
}
}
}
点*farthestPoint=最远的子单元[0];
int距离=*距离_sub[0];
对于(int index=1;indexx>maxXPoints[thread\u id]->x){
Point* farthestPoint;
//int distance = *distance_sub[0]; //is this a bug shouldn't distance be a double?
double distance = 0
#pragma omp parallel private
{
Point farthest_sub = input[0];
double distance_sub = 0;
#pragma omp for nowait
for (int index = 1; index < input.size(); index++){
// for loop code
}
#pragma omp critical
{
if (distance < distance_sub){
farthestPoint = farthest_sub;
}
}
#pragma omp barrier
//next part of code
}