Hi All,

We propose enabling SIMD-based sort for list_sort using the x86-simd-sort 
library (https://github.com/intel/x86-simd-sort).

The existing list_sort takes a comparator function to compare pairs of 
ListCell. On the other hand, x86-simd-sort requires an array of numeric values 
to sort, and it returns an array of sorted indices. To enable x86-simd-sort, we 
add new list_sort_simd functions that take an extractor function. The function 
extracts a value (float or uint32) from a ListCell. Those values are then 
collected into an array for x86-simd-sort to work on. A comparator function can 
still be passed to be used as tie-breaker.

typedef float (*list_sort_extractor_float)(const ListCell *a);
typedef uint32 (*list_sort_extractor_uint32)(const ListCell *a);

void list_sort_simd_float(List *list, list_sort_extractor_float extract, 
list_sort_comparator cmp);
void list_sort_simd_uint32(List *list, list_sort_extractor_uint32 extract, 
list_sort_comparator cmp);

These functions will exist alongside the current list_sort. Existing list_sort 
use cases in Postgres or extensions will not be affected by default, and they 
can be converted to list_sort_simd functions where it makes sense in terms of 
performance.

This feature introduces the x86-simd-sort library as a dependency. We plan to 
make the dependency optional, using a configuration option, such as 
--with-x86-simd-sort. If building without this option, list_sort_simd functions 
could fall back to the existing list_sort (e.g., by creating a comparator 
function that combines the extracted value and the tie-breaker comparator 
function). Alternatively (or in addition), we could add a function to report 
whether x86-simd-sort is available.

We identified a first use case for list_sort_simd_float in pgvector. As part of 
HNSW index construction, pgvector uses list_sort to sort candidate vectors by 
distance. Using list_sort_simd_float, we observed reduction in index build time 
in some scenarios. For example, we observed 7% reduction in index build time 
with the gist-960 dataset and 10% with the dbpedia-openai-1000k dataset 
(ANN-Benchmarks, HNSW index with halfvec, m=80). We are also looking into 
microbenchmarks to measure list_sort performance independently.

We'd appreciate feedback on this approach. In the meantime, we will complete 
the patch to share. We also plan to extend SIMD-based sort to tuple sort in the 
future.

Thanks!

Luca Giacchino

Reply via email to