5

我正在 Beowulf 集群上使用 MPI 进行并行编程。我们为模拟退火编写了并行算法。它工作正常。我们预计执行速度比串行代码快 15 倍。但是我们在不同的架构和操作系统上执行了一些串行 C 代码,这样我们就可以有不同的数据集来进行性能测量。我们在代码中使用了这个 Random 函数。我们在 windows 和 ubuntu linux 上都使用 GCC。我们发现在 linux 上执行需要更长的时间,我们不知道为什么。有人可以使用 gcc 在 linux 和 windows 上编译此代码并尝试向我解释。

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>

    int main (int argc, char** argv){
        double Random();

        int k,NUM_ITERATIONS = 10;
        clock_t start_time = clock();
        NUM_ITERATIONS=atoi(argv[1]);

        // iniciranje random generatora 
        srand(time(NULL));

        for(k=0; k<NUM_ITERATIONS; k++){
                double raa = Random();
        }
        clock_t end_time = clock();
    printf("Time of algorithm execution: %lf seconds\n",  ((double) (end_time - start_time)) / CLOCKS_PER_SEC);

    return 0;
    }

    // generate random number bettwen 0 and 1
    double Random(){
        srand(rand());
        double a = rand();
        return a/RAND_MAX; 
    }

如果我使用 100 000 000 作为 NUM_ITERATIONS 的参数执行它,我在 linux 上的执行速度比在 windows 上慢 20 倍。在具有双引导 win + ubuntu linux 的相同架构的机器上进行了测试。我们需要帮助,因为这个 Random 函数是我们想要用数据显示的瓶颈。

4

2 回答 2

8

在 Linux gcc 上,对srand(rand());Random 函数的调用占 98% 以上的时间。

生成随机数不需要它,至少在循环内不需要。你已经打了srand()一次,就够了。

于 2009-12-08T13:49:39.973 回答
1

我会调查其他可用的随机数生成器。许多已经过良好测试并且在执行速度和伪随机性方面都比标准库随机函数执行得更好。我还为研究生课程实现了自己的 RNG,但我不会在生产代码中使用它。选择经过社区审查的东西。 Random.org是测试您选择的任何 RNG 的好资源。

于 2009-12-08T14:08:17.040 回答