在不同浮点精度之间切换时使用我自己的 std::mersenne_twister_engine 模板参数

Using my own template parameters for std::mersenne_twister_engine when switching between different floating point precisions

std::mt19937 is a typedef of std::mersenne_twister_engine。如果我在采样中的不同浮点精度之间切换,我是否应该为后者使用自己的模板参数?如果可以,怎么做?

现在我有这样的东西

#include <random>
#include <iostream>

int main()
{
    using float_type = double;

    std::random_device rd;  
    std::mt19937 gen(rd()); 
    std::uniform_real_distribution<float_type> dis(1.0, 2.0);
    for (int n = 0; n < 1e6; ++n) {
        std::cout << dis(gen) << ' ';
    }
    std::cout << '\n';
}

但是当我将 using float_type = double; 切换为 using float_type = float; 时,并没有太多的加速。实际上,在我的其他一些代码中,使用 float 实际上要慢得多!

如果有帮助,请提供生成文件。我用 make 编译后使用 time ./prog 作为粗略计时器,我是 运行 Ubuntu 18.04.2 LTS,我的处理器是 Intel® Xeon(R) CPU E3-1241 v3 @ 3.50GHz × 8 .

PROG = prog
SRCS = main.cpp
OBJS = main.o
CXX = g++
CXXFLAGS = -std=c++11 -O3 $(INCLUDES) -pg


all: $(PROG)

$(PROG): $(OBJS)
        $(CXX) -o $@ $(OBJS) 

main.cpp :
        $(CXX) $(CXXFLAGS) -c 

main.o : main.cpp
        $(CXX) $(CXXFLAGS) -c main.cpp

.PHONY: clean
clean:
        rm -f $(PROG) $(OBJS) 

Should I be using my own template parameters for the latter if I'm switching between different floating point precisions in my sampling? If so, how?

当然,您可以使用 64 位引擎对双精度采样(尾数为 53 位长),对浮点数采样使用 32 位引擎。

#define USE_DOUBLES

...

#ifdef USE_DOUBLES
    using float_type = double;
    using rng        = std::mt19937_64;
#else
    using float_type = float;
    using rng        = std::mt19937;
#endif

mt19937_64 是 MT 的别名,每次调用生成 64 位随机数