From b48a67144f6c24e9657ed3f46ff59c2cb07e58f7 Mon Sep 17 00:00:00 2001 From: I <1091761+wx257osn2@users.noreply.github.com> Date: Wed, 31 May 2023 19:56:09 +0900 Subject: [PATCH 1/2] fix windows CI MSVC doesn't accept unsigned index with pragma omp parallel for --- faiss/utils/utils.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/faiss/utils/utils.cpp b/faiss/utils/utils.cpp index 9cc8d3fe45..65f6c7ed0c 100644 --- a/faiss/utils/utils.cpp +++ b/faiss/utils/utils.cpp @@ -28,6 +28,7 @@ #include <omp.h> #include <algorithm> +#include <type_traits> #include <vector> #include <faiss/impl/AuxIndexStructures.h> @@ -447,7 +448,10 @@ uint64_t bvec_checksum(size_t n, const uint8_t* a) { void bvecs_checksum(size_t n, size_t d, const uint8_t* a, uint64_t* cs) { #pragma omp parallel for if (n > 1000) - for (size_t i = 0; i < n; i++) { + for (std::make_signed<std::size_t>::type i_ = 0; + static_cast<std::size_t>(i_) < n; + i_++) { + const auto i = static_cast<std::size_t>(i_); cs[i] = bvec_checksum(d, a + i * d); } } From a84c8807f698e9657da407e67a8a061c9c6fdaff Mon Sep 17 00:00:00 2001 From: I <1091761+wx257osn2@users.noreply.github.com> Date: Wed, 31 May 2023 21:22:33 +0900 Subject: [PATCH 2/2] fix mac CI OpenMP (at least the specification) doesn't accept the expression includes a cast as loop condition with pragma omp parallel for --- faiss/utils/utils.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/faiss/utils/utils.cpp b/faiss/utils/utils.cpp index 65f6c7ed0c..5f3e5eb964 100644 --- a/faiss/utils/utils.cpp +++ b/faiss/utils/utils.cpp @@ -447,10 +447,12 @@ uint64_t bvec_checksum(size_t n, const uint8_t* a) { } void bvecs_checksum(size_t n, size_t d, const uint8_t* a, uint64_t* cs) { -#pragma omp parallel for if (n > 1000) - for (std::make_signed<std::size_t>::type i_ = 0; - static_cast<std::size_t>(i_) < n; - i_++) { + // MSVC can't accept unsigned index for #pragma omp parallel for + // so below codes only accept n <= std::numeric_limits<ssize_t>::max() + using ssize_t = std::make_signed<std::size_t>::type; + const ssize_t size = n; +#pragma omp parallel for if (size > 1000) + for (ssize_t i_ = 0; i_ < size; i_++) { const auto i = static_cast<std::size_t>(i_); cs[i] = bvec_checksum(d, a + i * d); }