Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 并行化QuickHull:OpenMP提供较小的加速比,而TBB提供负加速比_C++_Parallel Processing_Openmp_Tbb - Fatal编程技术网

C++ 并行化QuickHull:OpenMP提供较小的加速比,而TBB提供负加速比

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

当涉及到使用OpenMP和TBB的共享内存编程时,我是一个初学者

我正在实现QuickHull算法()的并行版本,以查找一组数据点的凸包。()

基本上可以并行完成以下任务:

  • 找到最左边和最右边的点(P和Q)
  • 根据这两个点(P和Q)的线连接拆分整个数据集
  • 对于这两个集合中的每一个,获取距离上次拆分发生的线(PQ)最远的点
  • 根据最远点(C)将数据分为两组:一组包含线PC右侧的所有元素,另一组包含线QC右侧的所有元素
  • 注意,第3部分和第4部分是递归完成的,直到每个子集都为空

    首先,我已经使用OpenMP完成了这项工作,主要是使用
    #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 
    }