C 并行小型网络排序

C 并行小型网络排序,c,algorithm,sorting,parallel-processing,sorting-network,C,Algorithm,Sorting,Parallel Processing,Sorting Network,我当时正在研究网络排序(对于小于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 S

我当时正在研究网络排序(对于小于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);
#定义交换(x,y)if(data[y]
我使用的是
long int
数组(因此每个元素的大小为8字节)。那么在C语言中有没有简单的方法来并行这些操作呢?是否有任何特定于硬件的命令可用于实现这一点(SIMD、ASM(x86)等)

如所述,您可以通过将交换代码的定义更改为以下定义来提高交换代码的性能:

#define SWAP(x, y) {                        \
    int dx = data[x];                       \
    data[x] = dx < data[y] ? dx : data[y];  \
    data[y] ^= dx ^ data[x];                \
}
定义交换(x,y){\ int dx=数据[x]\ 数据[x]=dx 根据这篇研究论文,这个版本的
SWAP
没有分支,在GCC或Clang上编译了5条指令,优化程度相当不错。本文还暗示了这样一个事实,即少量指令实际上可能使代码受益于指令级并行性


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

您有多少个数组?它是一个包含大量元素(10亿~)的大型数组。我在使用的掉期中使用了一个偏移量。它将类似于交换(1,2,lo);其中lo是数组中的偏移量。您说过要对小于8的大小进行排序。那么你在排序什么,整个数组还是它的一部分呢?我使用一种并行合并排序的形式,当数组大小合适时,你会有很多小数组需要排序。如您所示,不需要并行化您的代码。只需分发要单独排序的小数组。