Использование моих собственных параметров шаблона для std :: mersenne_twister_engine при переключении между различными значениями точности с плавающей запятой - PullRequest
0 голосов
/ 23 мая 2019

std::mt19937 является типом определения 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 после компиляции с make в качестве грубого таймера, и я использую Ubuntu 18.04.2 LTS, а мой процессор - процессор Intel® Xeon® E3-1241 v3 @ 3,50 ГГц × 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) 

1 Ответ

1 голос
/ 25 мая 2019

Должен ли я использовать свои собственные параметры шаблона для последнего, если я переключаюсь между различными значениями точности с плавающей точкой в ​​моей выборке?Если да, то как?

Конечно, вы можете использовать 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 битами случайности за вызов

...