GCC表现

aze*_*pdx 5 c compiler-construction gcc simulated-annealing mpi

我正在使用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; 
    }
Run Code Online (Sandbox Code Playgroud)

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

Did*_*set 8

在Linux gcc上,srand(rand());随机函数内的调用占98%以上的时间.

生成随机数不需要,至少不在循环内.你已经打过srand()一次电话就足够了.

  • 这很容易测试 - 打印出来自Random()的返回值,并用`srand(1);`替换`srand(time(NULL));``main()`.运行几次,您将看到完全相同的输出序列.把它改成`srand(2);`,你会看到不同的序列.再回到1,相同的旧序列.重新播种而不添加任何新信息实际上是浪费时间. (5认同)
  • @ZeKoU - 我不是说你错了,但这段代码闻起来很腥.我认为(但不确定)您可能会生成确定性或可猜测的序列.第一次调用`srand`里面的'rand`总是会以相同的值来播种srand.从那里,我认为攻击者可以重新运行你的能力.我相信dtrosset是正确的.另外,你可能想要调用`srand(time(NULL))`:http://stackoverflow.com/questions/1108780/why-do-i-always-get-the-same-sequence-of-random-数字与 - 兰特 (3认同)

Sco*_*e T 1

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