2009-12-08 17 views
5

Tôi đang lập trình song song với MPI trên cụm Beowulf. Chúng tôi đã viết thuật toán song song cho việc ủ mô phỏng. Nó hoạt động tốt. Chúng tôi dự kiến ​​thực thi nhanh hơn 15 lần so với mã nối tiếp. Nhưng chúng tôi đã thực hiện một số việc thực thi mã C nối tiếp trên các kiến ​​trúc và hệ điều hành khác nhau để chúng tôi có thể có các bộ dữ liệu khác nhau để đo lường hiệu suất. Chúng tôi đã sử dụng chức năng Ngẫu nhiên này trong mã của chúng tôi. Chúng tôi sử dụng GCC trên cả hai cửa sổ và linux Ubuntu. Chúng tôi đã tìm ra rằng việc thực hiện mất nhiều thời gian hơn trên các linux và chúng tôi không biết tại sao. Ai đó có thể biên dịch mã này trên linux và windows với gcc và cố gắng giải thích cho tôi.Hiệu năng 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; 
    } 

Nếu tôi thực thi nó với 100 000 000 làm đối số cho NUM_ITERATIONS, tôi nhận được thực thi chậm hơn 20 lần trên linux so với trên cửa sổ. Thử nghiệm trên máy có cùng kiến ​​trúc với khởi động kép win + ubuntu linux. Chúng tôi cần trợ giúp vì chức năng Ngẫu nhiên này là nút cổ chai cho những gì chúng tôi muốn hiển thị cùng với dữ liệu của mình.

+0

Tùy chọn dòng lệnh nào bạn chuyển sang gcc khi biên dịch trong linux và những tùy chọn nào đang được sử dụng trong cửa sổ. –

+0

"gcc -o rand rand.c -lm" Trên cả hai hệ thống. – Zec

+2

Bất kỳ trình tạo số ngẫu nhiên nào mà bạn kết thúc, khởi tạo nó ** một lần ** mỗi lần chạy chương trình. ** CHỈ CÓ NGÀY! ** – pmg

Trả lời

1

Tôi sẽ điều tra các trình tạo số ngẫu nhiên khác có sẵn. Nhiều tồn tại đã được thử nghiệm tốt và hoạt động tốt hơn các hàm ngẫu nhiên của thư viện chuẩn, cả về tốc độ thực thi và về mặt giả ngẫu nhiên. Tôi cũng đã thực hiện RNG của riêng mình cho một lớp sau đại học, nhưng tôi sẽ không sử dụng nó trong mã sản xuất. Đi với một cái gì đó đã được xem xét bởi cộng đồng. Random.org là một tài nguyên tốt để kiểm tra bất kỳ RNG nào bạn chọn.

8

Trên gcc Linux, cuộc gọi tới srand(rand()); trong tài khoản Hàm ngẫu nhiên trong hơn 98% thời gian.

Không cần thiết để tạo ra các số ngẫu nhiên, ít nhất không phải trong vòng lặp. Bạn đã gọi srand() một lần, đủ rồi.

+0

Chúng ta cần thay đổi hạt giống mọi lúc. void srand (unsigned int seed); Trình tạo số giả ngẫu nhiên được khởi tạo bằng đối số được truyền dưới dạng hạt. Đối với mỗi giá trị hạt giống khác nhau được sử dụng trong một cuộc gọi đến thương hiệu, trình tạo số giả ngẫu nhiên có thể được mong đợi để tạo ra một loạt các kết quả khác nhau trong các cuộc gọi tiếp theo tới rand. Hai khởi tạo khác nhau với cùng một hạt giống, chỉ thị trình tạo giả ngẫu nhiên để tạo ra cùng một loạt các kết quả cho các cuộc gọi tiếp theo tới rand trong cả hai trường hợp. – Zec

+3

@ZeKoU - Tôi không nói bạn sai, nhưng mã này có mùi khá cá. Tôi nghĩ (nhưng không chắc chắn) rằng bạn có thể tạo ra một chuỗi xác định hoặc có thể đoán được. Lần gọi đầu tiên là 'rand' bên trong' srand' luôn luôn giống srand với cùng giá trị. Từ đó, tôi nghĩ một kẻ tấn công có thể chạy lại khả năng của bạn. Tôi tin rằng dtrosset là chính xác. Ngoài ra, bạn có thể muốn gọi 'srand (time (NULL))' thay vào đó: http://stackoverflow.com/questions/1108780/why-do-i-always-get-the-same-sequence-of-random- số-với-rand –

+0

nó không xảy ra với bạn rằng int randPrime() {return srand (rand()), rand();} ? – ima