OpenMP程序比顺序程序慢

当我尝试下面的代码

double start = omp_get_wtime(); long i; #pragma omp parallel for for (i = 0; i <= 1000000000; i++) { double x = rand(); } double end = omp_get_wtime(); printf("%f\n", end - start); 

执行时间大约是168秒,而顺序版本只花费20秒。

我仍然是并行编程的新手。 我怎么能得到一个更快的顺序版本?

随机数生成器rand(3)使用全局状态variables(隐藏在(g)libc实现中)。 从多个线程访问它们导致caching问题,也不是线程安全的。 您应该使用带有seed参数的rand_r(3)调用来保护线程:

 long i; unsigned seed; #pragma omp parallel private(seed) { // Initialise the random number generator with different seed in each thread // The following constants are chosen arbitrarily... use something more sensible seed = 25234 + 17*omp_get_thread_num(); #pragma omp for for (i = 0; i <= 1000000000; i++) { double x = rand_r(&seed); } } 

请注意,这将在并行执行时产生不同的随机数据stream,而不是以串行方式执行。 我也会推荐erand48(3)作为一个更好的(伪)随机数源。