使用OpenMP生成随机数时为什么没有加速?

时间:2018-06-13 15:32:06

标签: c multithreading random parallel-processing openmp

我希望运行一种需要生成随机数的monte carlo模拟,以及一组基于这些随机数的指令。

我希望使用并行处理,但在测试我的代码(用C语言编写)时,似乎有更多内核的反向加速!我不确定我做错了什么。然后我复制了代码形式another answer并仍然得到了这种效果。

从答案中稍加修改的代码是

#define NRANDS 1000000
int main() {

    int a[NRANDS];

    #pragma omp parallel default(none) shared(a)
    {
        int i;
        unsigned int myseed = omp_get_thread_num();
        #pragma omp for
        for(i=0; i<NRANDS; i++)
                a[i] = rand_r(&myseed);
    }
    double sum = 0.;
    for (long int i=0; i<NRANDS; i++) {
        sum += a[i];
    }
    printf("sum = %lf\n", sum);

    return 0;
}

然后我在终端中运行time命令,以便计算运行所需的时间。我使用export OMP_NUM_THREADS=2改变了允许的线程数。我终端的输出是:

Thread total: 1
sum = 1074808568711883.000000
real    0m0,041s
user    0m0,036s
sys 0m0,004s

Thread total: 2
sum = 1074093295878604.000000
real    0m0,037s
user    0m0,058s
sys 0m0,008s

Thread total: 3
sum = 1073700114076905.000000
real    0m0,032s
user    0m0,061s
sys 0m0,010s

Thread total: 4
sum = 1073422298606608.000000

real    0m0,035s
user    0m0,074s
sys 0m0,024s

1 个答案:

答案 0 :(得分:2)

请注意time命令adds up the time spent on all cores打印usersys值时。观察您的墙上时间(real)几乎不变。

此外,您的基准太小了。创建和管理线程的成本很高。这种开销可能会使随机数生成的实际执行时间蒙上阴影。百万的价值并不是那么多。换句话说,实际计算随机数所花费的时间非常小,以至于它在噪音中丢失了,而且与设置/拆卸成本相比相形见绌。如果你生成更多,你可能会开始看到由于并行性的优势。