相关疑难解决方法(0)

C++ 11随机数生成器的线程安全性

在C++ 11中,有许多新的随机数生成器引擎和分发函数.它们是否安全?如果您在多个线程之间共享一个随机分布和引擎,它是否安全并且您是否仍会收到随机数?我正在寻找的场景是这样的,

void foo() {
    std::mt19937_64 engine(static_cast<uint64_t> (system_clock::to_time_t(system_clock::now())));
    std::uniform_real_distribution<double> zeroToOne(0.0, 1.0);
#pragma omp parallel for
    for (int i = 0; i < 1000; i++) {
        double a = zeroToOne(engine);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用OpenMP或

void foo() {
    std::mt19937_64 engine(static_cast<uint64_t> (system_clock::to_time_t(system_clock::now())));
    std::uniform_real_distribution<double> zeroToOne(0.0, 1.0);
    dispatch_apply(1000, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(size_t i) {
        double a = zeroToOne(engine);
    });
}
Run Code Online (Sandbox Code Playgroud)

使用libdispatch.

c++ openmp thread-safety grand-central-dispatch c++11

32
推荐指数
2
解决办法
1万
查看次数

将程序拆分为4个线程比单个线程慢

过去一周我一直在写一个光线跟踪器,并且已经达到了足够多线程有意义的程度.我已经尝试使用OpenMP来并行化它,但是用更多线程运行它实际上比用一个线程运行它要慢.

阅读其他类似问题,特别是有关OpenMP的问题,一个建议是gcc更好地优化串行代码.但是,运行下面的编译代码的export OMP_NUM_THREADS=1速度是以下的两倍export OMP_NUM_THREADS=4.即两次运行的编译代码相同.

运行程序time:

> export OMP_NUM_THREADS=1; time ./raytracer
real    0m34.344s
user    0m34.310s
sys     0m0.008s


> export OMP_NUM_THREADS=4; time ./raytracer
real    0m53.189s
user    0m20.677s
sys     0m0.096s
Run Code Online (Sandbox Code Playgroud)

用户时间比实际小很多,这在使用多个核心时很不寻常 - 用户应该比实际大,因为多个核心同时运行.

我使用OpenMP并行化的代码

void Raytracer::render( Camera& cam ) {

    // let the camera know to use this raytracer for probing the scene
    cam.setSamplingFunc(getSamplingFunction());

    int i, j;

    #pragma omp parallel private(i, j)
    {

        // Construct a ray for each pixel.
        #pragma omp for …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading openmp contention

6
推荐指数
1
解决办法
3703
查看次数