Radix使用SSE排序

时间:2017-02-10 23:57:22

标签: c++ sorting sse

我正在尝试使用SSE编写基数排序的C ++实现。 这是没有SSE的基数排序的当前实现(基于维基百科)。

int numBuckets = 16;
int radix = 4;
int mask = 0xF;
void radix_sort(long* arr, int N) {
    int nradix, oldCount, total;
    long val;

    int counts[numBuckets];
    long arrCopy[N];

    for (int nradix = 0; nradix < 64; nradix+=radix) {
        // refresh the counts
        for (int j = 0; j < numBuckets; ++j) counts[j] = 0;

        // get the counts and the copy
        for (int j = 0; j < N; ++j) {
            val = arr[j];
            ++counts[(val >> nradix) & mask];
            arrCopy[j] = val;
        }

        // get the starting index
        total = 0;
        for (int j = 0; j < numBuckets; ++j) {
            oldCount = counts[j];
            counts[j] = total;
            total += oldCount;
        }

        // copy back to the array
        for (int j = 0; j < N; ++j) {
            val = arrCopy[j];
            arr[counts[(val >> nradix) & mask]++] = val;
        }
    }
}

我能想到的唯一可以上传SSE的事情只有在使用_mm_setzero_ps()刷新计数时才会这样。 还有其他地方可以实施SSE来加速算法吗?谢谢。

0 个答案:

没有答案