Skip to content

Commit

Permalink
Fix windows CI (#2889)
Browse files Browse the repository at this point in the history
Summary:
#2882 added [a for loop, which has unsigned index, qualified with `#pragma omp parallel for`](https://github.com/facebookresearch/faiss/pull/2882/files#diff-5a89dcb99a1cce3f297c7f7dfc8e221306b281d4ced6dac1e0fc0fa54188195fR449-R452), but it seems that [MSVC doesn't support unsigned index with `#pragma omp parallel for`](https://app.circleci.com/pipelines/github/facebookresearch/faiss/4220/workflows/ee72de05-6ead-42d9-8ec5-44772e9fd41b/jobs/22529?invite=true#step-104-333) (I think this would not be conformed to OpenMP specification, but...)

I (finally) change the loop with signed index. This changes introduce the precondition `n <= std::numeric_limits<std::make_signed_t<std::size_t>>::max()` , but usually this is `true` I think, so I just put this limitation as a comment instead of any `FAISS_ASSERT` or something like that.

Pull Request resolved: #2889

Reviewed By: wickedfoo

Differential Revision: D46325322

Pulled By: alexanderguzhva

fbshipit-source-id: c68f4c8be3db188ac067e053c6c716e2896f75c0
  • Loading branch information
wx257osn2 authored and facebook-github-bot committed May 31, 2023
1 parent 90349f2 commit bbc95b1
Showing 1 changed file with 8 additions and 2 deletions.
10 changes: 8 additions & 2 deletions faiss/utils/utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include <omp.h>

#include <algorithm>
#include <type_traits>
#include <vector>

#include <faiss/impl/AuxIndexStructures.h>
Expand Down Expand Up @@ -446,8 +447,13 @@ 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++) {
// 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);
}
}
Expand Down

0 comments on commit bbc95b1

Please sign in to comment.