跨境网站入口,wordpress 面包屑导航代码,阜新网站开发,极速网站建设并行模式库 (PPL) 提供了对数据集合并行地执行工作的算法。这些算法类似于 C 标准库提供的算法。并行算法由并发运行时中的现有功能组成。
在许多情况下#xff0c;parallel_sort 会提供速度和内存性能的最佳平衡。 但是#xff0c;当您增加数据集的大小、可用处理器的数量或…并行模式库 (PPL) 提供了对数据集合并行地执行工作的算法。这些算法类似于 C 标准库提供的算法。并行算法由并发运行时中的现有功能组成。
在许多情况下parallel_sort 会提供速度和内存性能的最佳平衡。 但是当您增加数据集的大小、可用处理器的数量或比较函数的复杂性时parallel_buffered_sort 或 parallel_radixsort 性能更佳。 确定在任何给定方案中使用哪种排序算法的最佳方式是体验并度量在有代表性计算机配置下对典型数据排序需要多长时间。 在选择排序策略时请遵循以下准则。
数据集的大小。 在本文档中小型数据集包含的元素少于 1,000 个中型数据集包含的元素介于 10,000 和 100,000 个之间而大型数据集包含的元素多于 100,000 个;您的比较函数或哈希函数所执行的工作量;可用计算资源的量;数据集的特征。 例如一种算法对已完成近似排序的数据可能执行效果很好但对完全未排序的数据执行效果就不那么好了;区块的大小。 可选的 _Chunk_size 参数将指定算法在将整体排序细分成较小工作单元时何时从并行排序实现切换为串行排序实现。 例如如果提供的是 512算法会在工作单元包含 512 个或更少元素时切换到串行实现。 串行实现可以提高整体性能因为它消除了并行处理数据所需的开销;
以并行方式对小型数据集排序可能不值得即使是在您拥有大量的可用计算资源或您的比较函数或哈希函数执行相对大量的工作时。 可以使用 std::sort 函数对小型数据集排序。 当你指定的区块大小大于数据集时parallel_sort 和 parallel_buffered_sort 会调用 sort但是parallel_buffered_sort 将必须分配 O(N) 空间这样会因锁争用或内存分配而花费更多时间。
如果您必须节省内存或您的内存分配器容易出现锁争用问题请使用 parallel_sort 对中型数据集排序。 parallel_sort 不需要额外的空间其他算法需要 O(N) 空间。
当你的应用程序能够满足额外的 O(N) 空间需求时使用 parallel_buffered_sort 对中型数据集排序。 当您拥有大量的计算资源或高开销的比较函数或哈希函数时parallel_buffered_sort 尤其有用。
当你的应用程序能够满足额外的 O(N) 空间需求时使用 parallel_radixsort 对大型数据集排序。 当等效的比较操作开销较大或两种操作开销都很大时parallel_radixsort 尤其有用。
好的哈希函数的实现要求你知道数据集范围以及数据集中的每个元素如何转换为对应的无符号值。 由于哈希操作会处理无符号值如果无法生成无符号哈希值请考虑使用另外的排序策略。
下面的示例针对相同大小的随机数据集对 sort、parallel_sort、parallel_buffered_sort 和 parallel_radixsort 的性能进行比较。
// choosing-parallel-sort.cpp
// compile with: /EHsc
#include ppl.h
#include random
#include iostream
#include windows.husing namespace concurrency;
using namespace std;// Calls the provided work function and returns the number of milliseconds
// that it takes to call that function.
template class Function
__int64 time_call(Function f)
{__int64 begin GetTickCount();f();return GetTickCount() - begin;
}const size_t DATASET_SIZE 10000000;// Create
// Creates the dataset for this example. Each call
// produces the same predefined sequence of random data.
vectorsize_t GetData()
{vectorsize_t data(DATASET_SIZE);generate(begin(data), end(data), mt19937(42));return data;
}int wmain()
{// Use std::sort to sort the data.auto data GetData();wcout LTesting std::sort...;auto elapsed time_call([data] { sort(begin(data), end(data)); });wcout L took elapsed L ms. endl;// Use concurrency::parallel_sort to sort the data.data GetData();wcout LTesting concurrency::parallel_sort...;elapsed time_call([data] { parallel_sort(begin(data), end(data)); });wcout L took elapsed L ms. endl;// Use concurrency::parallel_buffered_sort to sort the data.data GetData();wcout LTesting concurrency::parallel_buffered_sort...;elapsed time_call([data] { parallel_buffered_sort(begin(data), end(data)); });wcout L took elapsed L ms. endl;// Use concurrency::parallel_radixsort to sort the data.data GetData();wcout LTesting concurrency::parallel_radixsort...;elapsed time_call([data] { parallel_radixsort(begin(data), end(data)); });wcout L took elapsed L ms. endl;
}
/* Sample output (on a computer that has four cores):Testing std::sort... took 2906 ms.Testing concurrency::parallel_sort... took 2234 ms.Testing concurrency::parallel_buffered_sort... took 1782 ms.Testing concurrency::parallel_radixsort... took 907 ms.
*/
本示例中假设在排序期间分配 O(N) 空间是可以接受的parallel_radixsort 在此计算机配置下对这个数据集表现得最好。