Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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
并行化std::n_元素和std::分区 我移植C++代码,使用 STD::NthyEngult和 STD::分区< /C> > OpenCL。_C++_Algorithm_Sorting_Parallel Processing_Opencl - Fatal编程技术网

并行化std::n_元素和std::分区 我移植C++代码,使用 STD::NthyEngult和 STD::分区< /C> > OpenCL。

并行化std::n_元素和std::分区 我移植C++代码,使用 STD::NthyEngult和 STD::分区< /C> > OpenCL。,c++,algorithm,sorting,parallel-processing,opencl,C++,Algorithm,Sorting,Parallel Processing,Opencl,将数组中第n个最小数放置在第n个点,并排列其余元素,使数组中小于此数的所有元素位于其前面,大于此数的所有元素位于其后面。实际上,n_元素将数组分为3个存储桶:数字本身、所有小于它的数字和所有大于它的数字 通常,第n个元素是使用递归分区实现的:选择一个元素,根据元素是否小于该元素进行分区。然后,选择包含数组第n个元素的bucket并在该bucket上递归。nth\u元素与完整快速排序之间的主要区别在于快速排序在两个存储桶上都递归,而不仅仅是在包含nth元素的存储桶上 是第n个元素的较弱版本,它只

将数组中第n个最小数放置在第n个点,并排列其余元素,使数组中小于此数的所有元素位于其前面,大于此数的所有元素位于其后面。实际上,
n_元素
将数组分为3个存储桶:数字本身、所有小于它的数字和所有大于它的数字

通常,第n个元素是使用递归分区实现的:选择一个元素,根据元素是否小于该元素进行分区。然后,选择包含数组第n个元素的bucket并在该bucket上递归。
nth\u元素
与完整快速排序之间的主要区别在于快速排序在两个存储桶上都递归,而不仅仅是在包含nth元素的存储桶上


是第n个元素的较弱版本,它只将数组排序为两个bucket:条件为true的bucket和条件为false的bucket。我链接到的站点提供了以下实现:

while (first!=last) {
    while (pred(*first)) {
        ++first;
        if (first==last) return first;
    }
    do {
        --last;
        if (first==last) return first;
    } while (!pred(*last));
    swap (*first,*last);
    ++first;
}
return first;
其中pred是一个函数,用于评估元素是否应位于第一个存储桶中。基本上,该函数迭代地查找数组中位于错误位置的最外面的一对元素,并交换它们,当这对元素是同一个元素时停止


以下是我对并行化
n_元素
分区
的初步想法:

分区可以使用原子比较和交换来实现,但我不确定如何覆盖所有可能交换的值对。没有明显的方法可以在多个线程之间分配工作,因为分区需要比较元素,这些元素可能彼此相邻,也可能位于数组的两端。我也看不到一种方法可以避免线程B与线程a已经交换的元素进行比较,这是低效的

n_元素似乎更不可并行,因为它是递归的:每个分区都依赖于前一个分区对元素进行了部分排序的元素

对于这两个函数,有效的并行化策略可能需要与典型串行代码完全不同的方法



n\u元素
分区
的高效并行实现是否已经存在?如果不是,什么是好的并行化策略

Cuda推力已实现分区函数()

主要思想应该是:
使用前缀和计算元素在数组中的位置,然后重新排列数组。

n\u元素比递归元素更具迭代性(与快速排序不同,快速排序需要两次递归调用);矛盾的是,一旦完成了初始(也是最大的)分区,快速排序就更容易并行。谷歌搜索“并行分区”发现了这样一个演示:在其他有趣的点击中。@rici关于迭代与递归的比较,我有一个很好的观点。然而,由于第n个元素中的迭代完全依赖于先前迭代的结果,因此也可以将其视为递归。另外,谢谢你的链接!这里有一些非常好的想法。