我正在尝试使用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来加速算法吗?谢谢。