Lift the test for ext/random and sfmt19937
authorYedidya Feldblum <yfeldblum@fb.com>
Mon, 14 Sep 2015 19:51:19 +0000 (12:51 -0700)
committerfacebook-github-bot-4 <folly-bot@fb.com>
Mon, 14 Sep 2015 20:20:17 +0000 (13:20 -0700)
Summary: [Folly] Lift the test for `<ext/random>` and `__gnu_cxx::sfmt19937`.

Put an actual check in `folly/configure.ac` and use the result in `folly/Random.h`.

Reviewed By: @Gownta

Differential Revision: D2438420

folly/Random-inl.h
folly/Random.h
folly/configure.ac
folly/test/RandomTest.cpp

index 10da8d3ad2b1e7b37a30bc140e7ca1e3e732d9ff..f3b0433be02ee07cf29dd0397a4d693160bfded6 100644 (file)
@@ -67,7 +67,7 @@ constexpr size_t
 StateSize<std::mersenne_twister_engine<UIntType, w, n, m, r,
                                        a, u, d, s, b, t, c, l, f>>::value;
 
-#if FOLLY_USE_SIMD_PRNG
+#if FOLLY_HAVE_EXTRANDOM_SFMT19937
 
 template <class UIntType, size_t m, size_t pos1, size_t sl1, size_t sl2,
           size_t sr1, size_t sr2, uint32_t msk1, uint32_t msk2, uint32_t msk3,
index 25ebf8e51dd7e12afe299ee119afacebcbc67216..552eccd25962a68e16ae92cd86433f5e27a78254 100644 (file)
@@ -22,9 +22,8 @@
 #include <stdint.h>
 #include <folly/ThreadLocal.h>
 
-#if __GNUC_PREREQ(4, 8) && !defined(ANDROID)
+#if FOLLY_HAVE_EXTRANDOM_SFMT19937
 #include <ext/random>
-#define FOLLY_USE_SIMD_PRNG 1
 #endif
 
 namespace folly {
@@ -84,7 +83,7 @@ class Random {
 
  public:
   // Default generator type.
-#if FOLLY_USE_SIMD_PRNG
+#if FOLLY_HAVE_EXTRANDOM_SFMT19937
   typedef __gnu_cxx::sfmt19937 DefaultGenerator;
 #else
   typedef std::mt19937 DefaultGenerator;
index f0add33f4e86c98ba6bcb6a628769371b1777d3c..538d81089f2585d2cfe4a920d061ab5222a88d7d 100644 (file)
@@ -365,6 +365,20 @@ AC_CACHE_CHECK(
     [folly_cv_prog_cc_xsi_strerror_r=yes],
     [folly_cv_prog_cc_xsi_strerror_r=no])])
 
+AC_CACHE_CHECK(
+  [for ext/random and __gnu_cxx::sfmt19937],
+  [folly_cv_prog_cc_have_extrandom_sfmt19937],
+  [AC_COMPILE_IFELSE(
+    [AC_LANG_SOURCE[
+      #include <ext/random>
+      int main(int argc, char** argv) {
+        __gnu_cxx::sfmt19937 rng;
+        return 0;
+      }
+    ]],
+    [folly_cv_prog_cc_have_extrandom_sfmt19937=yes],
+    [folly_cv_prog_cc_have_extrandom_sfmt19937=no])])
+
 if test "$folly_cv_prog_cc_xsi_strerror_r" = "yes"; then
   AC_DEFINE([HAVE_XSI_STRERROR_R], [1], [Define to 1 if the runtime supports XSI-style strerror_r])
 fi
@@ -410,6 +424,8 @@ AM_CONDITIONAL([HAVE_LINUX], [test "$build_os" == "linux-gnu"])
 AM_CONDITIONAL([HAVE_WEAK_SYMBOLS],
                [test "$folly_cv_prog_cc_weak_symbols" = "yes"])
 AM_CONDITIONAL([HAVE_BITS_FUNCTEXCEPT], [test "$ac_cv_header_bits_functexcept_h" = "yes"])
+AM_CONDITIONAL([HAVE_EXTRANDOM_SFMT19937],
+               [test "$folly_cv_prog_cc_have_extrandom_sfmt19937" = "yes"])
 
 # Output
 AC_CONFIG_FILES([Makefile
index 4a45dcc18ab2746aa3928421379aa7df8b830986..e2586d80ce85a3ef86e007d92f59a44f953effa0 100644 (file)
@@ -36,7 +36,7 @@ TEST(Random, StateSize) {
   EXPECT_EQ(sizeof(uint_fast32_t) / 4 + 3,
             StateSize<std::minstd_rand0>::value);
   EXPECT_EQ(624, StateSize<std::mt19937>::value);
-#if FOLLY_USE_SIMD_PRNG
+#if FOLLY_HAVE_EXTRANDOM_SFMT19937
   EXPECT_EQ(624, StateSize<__gnu_cxx::sfmt19937>::value);
 #endif
   EXPECT_EQ(24, StateSize<std::ranlux24_base>::value);