diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f3e5bafb4..bad392de6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -234,6 +234,7 @@ jobs: os: - windows-latest - ubuntu-latest + - macos-latest steps: - uses: actions/checkout@v4 @@ -267,6 +268,7 @@ jobs: os: - windows-latest - ubuntu-latest + - macos-latest steps: - uses: actions/checkout@v4 diff --git a/diskann-benchmark-simd/examples/test_mac.json b/diskann-benchmark-simd/examples/test_mac.json new file mode 100644 index 000000000..b4f940e19 --- /dev/null +++ b/diskann-benchmark-simd/examples/test_mac.json @@ -0,0 +1,1390 @@ +{ + "search_directories": [], + "jobs": [ + { + "type": "simd-op", + "content": { + "query_type": "float32", + "data_type": "float32", + "arch": "scalar", + "runs": [ + { + "distance": "squared_l2", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + } + ] + } + }, + { + "type": "simd-op", + "content": { + "query_type": "float32", + "data_type": "float32", + "arch": "scalar", + "runs": [ + { + "distance": "squared_l2", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + } + ] + } + }, + { + "type": "simd-op", + "content": { + "query_type": "float32", + "data_type": "float32", + "arch": "reference", + "runs": [ + { + "distance": "squared_l2", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + } + ] + } + }, + + { + "type": "simd-op", + "content": { + "query_type": "float16", + "data_type": "float16", + "arch": "scalar", + "runs": [ + { + "distance": "squared_l2", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + } + ] + } + }, + { + "type": "simd-op", + "content": { + "query_type": "float16", + "data_type": "float16", + "arch": "scalar", + "runs": [ + { + "distance": "squared_l2", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + } + ] + } + }, + { + "type": "simd-op", + "content": { + "query_type": "float16", + "data_type": "float16", + "arch": "reference", + "runs": [ + { + "distance": "squared_l2", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + } + ] + } + }, + + + { + "type": "simd-op", + "content": { + "query_type": "uint8", + "data_type": "uint8", + "arch": "scalar", + "runs": [ + { + "distance": "squared_l2", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + } + ] + } + }, + { + "type": "simd-op", + "content": { + "query_type": "uint8", + "data_type": "uint8", + "arch": "scalar", + "runs": [ + { + "distance": "squared_l2", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + } + ] + } + }, + { + "type": "simd-op", + "content": { + "query_type": "uint8", + "data_type": "uint8", + "arch": "reference", + "runs": [ + { + "distance": "squared_l2", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + } + ] + } + }, + + + { + "type": "simd-op", + "content": { + "query_type": "int8", + "data_type": "int8", + "arch": "scalar", + "runs": [ + { + "distance": "squared_l2", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + } + ] + } + }, + { + "type": "simd-op", + "content": { + "query_type": "int8", + "data_type": "int8", + "arch": "scalar", + "runs": [ + { + "distance": "squared_l2", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + } + ] + } + }, + { + "type": "simd-op", + "content": { + "query_type": "int8", + "data_type": "int8", + "arch": "reference", + "runs": [ + { + "distance": "squared_l2", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "squared_l2", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "inner_product", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 100, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 128, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 160, + "num_points": 50, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 384, + "num_points": 24, + "loops_per_measurement": 5, + "num_measurements": 1 + }, + { + "distance": "cosine", + "dim": 768, + "num_points": 12, + "loops_per_measurement": 5, + "num_measurements": 1 + } + ] + } + } + ] +} diff --git a/diskann-benchmark-simd/src/bin.rs b/diskann-benchmark-simd/src/bin.rs index 74d11cd15..22bf84f03 100644 --- a/diskann-benchmark-simd/src/bin.rs +++ b/diskann-benchmark-simd/src/bin.rs @@ -57,9 +57,17 @@ mod tests { #[test] fn integration_test() { + // Use architecture-specific test file + // On macOS (and other non-x86_64 platforms), use test_mac.json with scalar architecture + // On x86_64, use test.json with x86-64-v3 architecture + #[cfg(target_arch = "x86_64")] + let test_file = "test.json"; + #[cfg(not(target_arch = "x86_64"))] + let test_file = "test_mac.json"; + let input_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")) .join("examples") - .join("test.json"); + .join(test_file); let tempdir = tempfile::tempdir().unwrap(); let output_path = tempdir.path().join("output.json"); diff --git a/diskann-disk/src/utils/aligned_file_reader/aligned_file_reader_factory.rs b/diskann-disk/src/utils/aligned_file_reader/aligned_file_reader_factory.rs index ef1049003..5fe6866a0 100644 --- a/diskann-disk/src/utils/aligned_file_reader/aligned_file_reader_factory.rs +++ b/diskann-disk/src/utils/aligned_file_reader/aligned_file_reader_factory.rs @@ -7,19 +7,24 @@ use diskann::ANNResult; #[cfg(all(not(miri), target_os = "linux"))] use super::LinuxAlignedFileReader; -#[cfg(miri)] +#[cfg(any(miri, target_os = "macos"))] use super::StorageProviderAlignedFileReader; #[cfg(all(not(miri), target_os = "windows"))] use super::WindowsAlignedFileReader; use crate::utils::aligned_file_reader::traits::AlignedReaderFactory; +#[cfg(any(miri, target_os = "macos"))] +use diskann_providers::storage::FileStorageProvider; + pub struct AlignedFileReaderFactory { pub file_path: String, } impl AlignedReaderFactory for AlignedFileReaderFactory { /* - Fall back to the StorageProviderAlignedFileReader when running in miri. Otherwise, miri fails with this error: + Fall back to the StorageProviderAlignedFileReader when running in miri or on macOS. + + For miri: Otherwise, miri fails with this error: --> C:\Users\\.cargo\registry\src\msdata.pkgs.visualstudio.com-32ec7033fece98f6\io-uring-0.6.3\src\sys\mod.rs:97:15 | 97 | to_result(syscall(SYSCALL_SETUP, entries as c_long, p as c_long) as _) @@ -35,8 +40,11 @@ impl AlignedReaderFactory for AlignedFileReaderFactory { --> diskann\src\model\aligned_file_reader\linux_aligned_file_reader.rs:221:24 | 221 | let mut ring = IoUring::new(MAX_IO_CONCURRENCY as u32)?; + + For macOS: macOS does not support io_uring (Linux-only) or IOCompletionPort (Windows-only). + StorageProviderAlignedFileReader provides a cross-platform fallback implementation. */ - #[cfg(miri)] + #[cfg(any(miri, target_os = "macos"))] type AlignedReaderType = StorageProviderAlignedFileReader; #[cfg(all(not(miri), target_os = "linux"))] @@ -46,9 +54,9 @@ impl AlignedReaderFactory for AlignedFileReaderFactory { type AlignedReaderType = WindowsAlignedFileReader; fn build(&self) -> ANNResult { - #[cfg(miri)] + #[cfg(any(miri, target_os = "macos"))] return StorageProviderAlignedFileReader::new( - &crate::storage::FileStorageProvider, + &FileStorageProvider, self.file_path.as_str(), ); diff --git a/diskann-platform/Cargo.toml b/diskann-platform/Cargo.toml index 07bbd3a33..69de7c573 100644 --- a/diskann-platform/Cargo.toml +++ b/diskann-platform/Cargo.toml @@ -16,6 +16,8 @@ tracing.workspace = true [target.'cfg(target_os = "linux")'.dependencies] io-uring = "0.6.4" + +[target.'cfg(unix)'.dependencies] libc = "0.2.148" [target.'cfg(target_os = "windows")'.dependencies.windows-sys] diff --git a/diskann-platform/src/lib.rs b/diskann-platform/src/lib.rs index ab05672a7..91f878352 100644 --- a/diskann-platform/src/lib.rs +++ b/diskann-platform/src/lib.rs @@ -3,14 +3,20 @@ * Licensed under the MIT license. */ -#[cfg(windows)] +#[cfg(target_os = "windows")] pub mod win; -#[cfg(windows)] +#[cfg(target_os = "windows")] pub use win::*; -#[cfg(not(windows))] +#[cfg(target_os = "linux")] pub mod linux; -#[cfg(not(windows))] +#[cfg(target_os = "linux")] pub use linux::*; + +#[cfg(target_os = "macos")] +pub mod macos; + +#[cfg(target_os = "macos")] +pub use macos::*; diff --git a/diskann-platform/src/macos/mod.rs b/diskann-platform/src/macos/mod.rs new file mode 100644 index 000000000..38ccf7e08 --- /dev/null +++ b/diskann-platform/src/macos/mod.rs @@ -0,0 +1,16 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT license. + */ +#![cfg_attr( + not(test), + warn(clippy::panic, clippy::unwrap_used, clippy::expect_used) +)] + +mod perf; +pub use perf::{ + get_number_of_processors, get_peak_workingset_size, get_process_cycle_time, get_process_time, + get_system_time, +}; + +pub mod ssd_io_context; diff --git a/diskann-platform/src/macos/perf.rs b/diskann-platform/src/macos/perf.rs new file mode 100644 index 000000000..32a537c61 --- /dev/null +++ b/diskann-platform/src/macos/perf.rs @@ -0,0 +1,70 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT license. + */ + +/// Gets the process cycle time. +/// On macOS, this returns 0 as cycle time is not readily available. +pub fn get_process_cycle_time() -> Option { + Some(0) +} + +/// Gets the process time in kernel and user modes. +/// On macOS, we use rusage to get process times. +pub fn get_process_time() -> Option { + use libc::{getrusage, rusage, RUSAGE_SELF}; + + let mut usage: rusage = unsafe { std::mem::zeroed() }; + let result = unsafe { getrusage(RUSAGE_SELF, &mut usage) }; + + if result == 0 { + // Convert timeval to microseconds (100-nanosecond units to match Windows FILETIME) + let user_time = + (usage.ru_utime.tv_sec as u64) * 10_000_000 + (usage.ru_utime.tv_usec as u64) * 10; + let system_time = + (usage.ru_stime.tv_sec as u64) * 10_000_000 + (usage.ru_stime.tv_usec as u64) * 10; + return Some(user_time + system_time); + } + + None +} + +/// Gets the system time in kernel and user modes. +/// On macOS, this is not easily available, so we return None. +pub fn get_system_time() -> Option { + None +} + +/// Gets the number of processors. +pub fn get_number_of_processors() -> Option { + use libc::{sysconf, _SC_NPROCESSORS_ONLN}; + + let result = unsafe { sysconf(_SC_NPROCESSORS_ONLN) }; + if result > 0 { + return Some(result as u64); + } + + None +} + +/// Retrieves the peak resident set size of the current process. +/// +/// On macOS, this function uses getrusage to retrieve the maximum resident set size. +/// The ru_maxrss field represents the maximum resident set size used (in bytes on macOS). +/// +/// # Returns +/// +/// An `Option` representing the peak working set size in bytes, or `None` if the operation fails. +pub fn get_peak_workingset_size() -> Option { + use libc::{getrusage, rusage, RUSAGE_SELF}; + + let mut usage: rusage = unsafe { std::mem::zeroed() }; + let result = unsafe { getrusage(RUSAGE_SELF, &mut usage) }; + + if result == 0 { + // On macOS, ru_maxrss is in bytes (unlike Linux where it's in kilobytes) + return Some(usage.ru_maxrss as u64); + } + + None +} diff --git a/diskann-platform/src/macos/ssd_io_context.rs b/diskann-platform/src/macos/ssd_io_context.rs new file mode 100644 index 000000000..b8302eecd --- /dev/null +++ b/diskann-platform/src/macos/ssd_io_context.rs @@ -0,0 +1,22 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT license. + */ + +use std::fs::File; + +/// The IOContext struct for disk I/O on macOS. +/// +/// macOS does not have io_uring (Linux-only) or IOCompletionPort (Windows-only). +/// This is a simple implementation that just holds a file handle. +/// For actual async I/O operations on macOS, use the StorageProviderAlignedFileReader +/// which provides a cross-platform fallback implementation. +pub struct IOContext { + pub file_handle: File, +} + +impl IOContext { + pub fn new(file_handle: File) -> Self { + IOContext { file_handle } + } +} diff --git a/diskann-quantization/src/error.rs b/diskann-quantization/src/error.rs index 9679e18c7..1e71a1de2 100644 --- a/diskann-quantization/src/error.rs +++ b/diskann-quantization/src/error.rs @@ -433,11 +433,12 @@ mod tests { fn inline_error_with_interior_mutability() { use std::error::Error; - let error = InlineError::<16>::new(ErrorWithInteriorMutability(Mutex::new(0))); + // Use 64 bytes to accommodate larger mutex sizes on macOS + let error = InlineError::<64>::new(ErrorWithInteriorMutability(Mutex::new(0))); assert_eq!( std::mem::size_of_val(&error), - 24, - "expected 16 bytes for the payload and 8-bytes for the vtable" + 72, + "expected 64 bytes for the payload and 8-bytes for the vtable" ); assert_eq!(error.to_string(), "0"); let debug = format!("{:?}", error);