在不同浮点精度之间切换时使用我自己的 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 位随机数
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 位随机数