【问题标题】:Parallelized Small Network sort并行小网络排序
【发布时间】:2015-10-01 02:25:25
【问题描述】:

我正在研究网络排序(对于小于 8 的数组),并注意到所有算法都专注于其允许并行操作的能力。这是一个大小为 5 的数组的集合。

 #define SWAP(x,y) if (data[y] < data[x]) { int tmp = data[x]; data[x] = data[y]; data[y] = tmp; }

    //Parallelizable
    SWAP(1, 2);
    SWAP(4, 5);

    //Parallelizable
    SWAP(0, 2);
    SWAP(3, 5);

    //Parallelizable
    SWAP(0, 1);
    SWAP(3, 4);
    SWAP(2, 5);

    //Parallelizable
    SWAP(0, 3);
    SWAP(1, 4);

    //Parallelizable
    SWAP(2, 4);
    SWAP(1, 3);

    //Parallelizable
    SWAP(2, 3);

我正在使用long int 数组(因此每个元素的大小为 8 个字节)。那么有什么简单的方法可以在 C 中并行化这些操作吗?是否有任何特定于硬件的命令可以用来实现这一点(SIMD、ASM(x86) 等)

【问题讨论】:

  • 你有多少个数组?
  • 它是一个包含很多元素(10 亿~)的大数组。我在我正在使用的 SWAP 中使用了一个偏移量。类似于 SWAP(1, 2 , lo);其中 lo 是数组中的偏移量。
  • 好吧,您说您正在对小于 8 的大小进行排序。那么您要排序的是整个数组还是部分数组?
  • 我正在使用一种并行合并排序的形式,当数组大小为
  • 好的,所以你有很多小数组需要排序。如您所示,无需并行化您的代码。只需分发要单独排序的小数组。

标签: c algorithm sorting parallel-processing sorting-network


【解决方案1】:

正如this answer 对关于排序小集合的问题所解释的那样,您实际上可以通过将交换代码的定义更改为以下内容来提高交换代码的性能:

#define SWAP(x, y) {                        \
    int dx = data[x];                       \
    data[x] = dx < data[y] ? dx : data[y];  \
    data[y] ^= dx ^ data[x];                \
}

根据研究论文Applying Sorting Networks to Synthesize Optimized Sorting Libraries,这个版本的SWAP 是无分支的,在 GCC 或 Clang 上编译成只有 5 条指令,具有不错的优化级别。这篇文章还暗示了这样一个事实,即少量指令实际上可能使代码受益于指令级并行性。

如果xor 不适用于要排序的类型,您可以使用SWAP 的替代版本,它使用两个条件而不是一个,它应该几乎与xor 版本一样快。实际上,我在我的一个排序库中使用了这个技巧,当我介绍这个技巧时,使用排序网络对一个小的固定大小的整数集合进行排序从“并不比插入排序好”到“比插入排序快几倍”。使用排序网络对 8 个整数的集合进行排序比在我的计算机上使用插入排序快约 5 倍。

【讨论】:

    猜你喜欢
    • 2011-04-23
    • 2013-12-01
    • 2017-06-30
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 2021-03-26
    相关资源
    最近更新 更多