gpt4 book ai didi

c++ - 为什么 threaded Random 这么慢,-(或者我的代码哪里错了!)

转载 作者:搜寻专家 更新时间:2023-10-31 01:10:10 25 4
gpt4 key购买 nike

我一直无法让线程化 C++ 随机数生成器在单核上胜过标准 rand()。 (我也看到了多个线程调用 rand() 的问题)

我知道某处存在并发问题,但我看不到。我已经到了下面,我知道 openmp 正在拆分 8 个可用内核。当我注释掉 omp 行时,我得到更快的结果。请帮忙!这让我发疯!

时代

Single thread
time ./a.out
real 0m3.497s
user 0m3.492s
sys 0m0.000s

OpemMP 8 cores
g++ -fopenmp randtests.cpp
time ./a.out
real 0m14.723s
user 1m52.275s
sys 0m0.712s

代码:

#include <omp.h>        
#include "boost/random.hpp"
#include "boost/generator_iterator.hpp"
#include <iostream>
#include <fstream>
#include <sstream>
#include "boost/random.hpp"

using namespace std;

class RNG
{
public:
typedef boost::random::mt19937 Engine;
typedef boost::random::uniform_smallint<int> Distribution;

Engine engine;
Distribution distributer;

RNG() : engine(), distributer() {
engine.seed(); }

int operator()() {
return distributer(engine);
}
};


int main(void) {

#pragma omp parallel
{
int i = omp_get_thread_num();
unsigned int myseed = i;
RNG r;
int y;
#pragma omp for ordered schedule(dynamic) nowait
for (unsigned int x = 0; x < 100000000; x++) {
y = r();
}
}

return 0;
}

最佳答案

您的代码执行如此缓慢有两个原因。

首先,您有 schedule(dynamic) 子句。这使得循环的调度是动态的,即每次迭代都按照先到先得的原则安排到一个单独的线程。这是非常低效的。使用 schedule(static) 让每个线程执行预先计算的迭代范围。均匀分布是在恒定时间内生成的,因此每次迭代都将花费相同的时间,因此无需使用动态调度。

其次,您已指示编译器创建一个有序的并行循环。由于涉及同步,排序会产生非常高的额外开销。在您的情况下,开销更大,因为调度是动态的。

我真的不明白为什么在这种情况下您同时具有动态计划和排序。只需将 OpenMP pragma 替换为:

#pragma omp for schedule(static)

(nowait 子句在这种情况下也只是表面影响)

关于c++ - 为什么 threaded Random 这么慢,-(或者我的代码哪里错了!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16203005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com