2009-12-08 4 views
5

Beowulf 클러스터에서 MPI와 병렬 프로그래밍을하고 있습니다. 시뮬레이션 어닐링을위한 병렬 알고리즘을 작성했습니다. 그것은 잘 작동합니다. 우리는 직렬 코드보다 15 배 빠른 실행을 기대합니다. 그러나 우리는 성능 측정을 위해 다양한 아키텍처와 운영 체제에서 직렬 C 코드를 실행하여 다른 데이터 세트를 사용할 수있었습니다. 우리는이 코드에서 임의의 함수를 사용했습니다. 우리는 GCC를 우분투 리눅스와 윈도우에서 사용합니다. 우리는 실행이 리눅스에서 훨씬 더 오래 걸린다는 것을 알아 냈습니다. 왜 그런지 알지 못합니다. 누군가 리눅스와 윈도우에서 gcc를 사용하여이 코드를 컴파일하고 설명해 줄 수 있습니까? 내가 NUM_ITERATIONS에 대한 인수로 100 000 000를 실행하면GCC 성능

#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; 
    } 

, 나는 윈도우보다 리눅스에 20 배 느린 실행을 얻을. 듀얼 부팅 win + 우분투 리눅스와 동일한 아키텍처의 머신에서 테스트되었습니다. 우리는이 무작위 기능이 우리가 우리의 데이터로 보여주고 자하는 것에 병목이되므로 도움이 필요합니다.

+0

linux에서 이것을 컴파일 할 때 gcc에 전달하는 명령 줄 옵션과 Windows에서 사용되는 옵션은 무엇입니까? –

+0

"gcc -o rand rand.c -lm" 두 시스템 모두. – Zec

+2

임의의 숫자 생성기로 끝나면 프로그램 실행 당 ** 한 번 ** 초기화하십시오. ** 한 번만! ** – pmg

답변

1

다른 난수 생성기를 사용할 수 있는지 조사 할 것입니다. 실행 속도와 의사 난수의 관점에서 표준 라이브러리 무작위 기능보다 잘 테스트되고 성능이 좋은 라이브러리가 많이 존재합니다. 또한 대학원 수업을 위해 자체 RNG를 구현했지만 프로덕션 코드에서는 사용하지 않을 것입니다. 지역 사회가 심사 한 것을 가지고 가십시오. Random.org은 선택한 RNG를 테스트하기에 좋은 리소스입니다.

8

Linux gcc에서는 Random 함수 내에서 srand(rand());을 호출하면 98 %가 넘습니다.

난수 생성에 필요하지 않습니다. 적어도 루프 내에는 필요하지 않습니다. 한 번 srand() 번으로 전화하면 충분합니다.

+0

우리는 항상 씨앗을 바꿀 필요가 있습니다. void srand (부호없는 int 시드); 의사 난수 생성 프로그램은 시드로 전달 된 인수를 사용하여 초기화됩니다. srand에 대한 호출에서 사용되는 모든 다른 시드 값의 경우 의사 난수 생성 프로그램은 이후의 rand 호출에서 서로 다른 결과 연속 생성을 기대할 수 있습니다. 동일한 시드를 사용하는 두 가지 다른 초기화는 두 경우 모두 rand에 대한 후속 호출에 대해 동일한 연속적인 결과를 생성하도록 의사 임의 생성기에 지시합니다. – Zec

+3

@ ZeKoU - 내가 틀렸다고 말하는 것은 아니지만이 코드는 꽤 생선 냄새가 난다. 결정적 또는 추측 가능한 시퀀스를 생성 할 수 있다고 생각합니다 (확실하지 않습니다). 'srand' 안의'rand' 호출은 항상 srand에 동일한 값을 뿌립니다. 거기에서, 나는 공격자가 당신의 능력을 다시 실행할 수 있다고 생각한다. 나는 dtrosset이 정확하다고 믿는다. 또한 대신'srand (time (NULL))'을 호출하는 것이 좋습니다. http://stackoverflow.com/questions/1108780/why-do-alal-get-the-same-sequence-of-random- numbers-with-rand –

+0

int randPrime() {return srand (rand()), rand();} ? – ima