2011-07-19 31 views
24

Tôi đang cố gắng so sánh hiệu suất của GPU với CPU. Đối với GPU NVIDIA, tôi đã sử dụng các loại cudaEvent_t để có được thời gian chính xác.Cách tạo bộ hẹn giờ có độ phân giải cao trong Linux để đo lường hiệu suất chương trình?

Đối với CPU Tôi đã sử dụng đoạn mã sau:

// Timers 
clock_t start, stop; 
float elapsedTime = 0; 

// Capture the start time 

start = clock(); 

// Do something here 
....... 

// Capture the stop time 
stop = clock(); 
// Retrieve time elapsed in milliseconds 
elapsedTime = (float)(stop - start)/(float)CLOCKS_PER_SEC * 1000.0f; 

Rõ ràng, đó là đoạn mã chỉ tốt nếu bạn đang đếm trong vài giây. Ngoài ra, kết quả đôi khi đi ra khá lạ.

Có ai biết cách nào đó để tạo bộ hẹn giờ có độ phân giải cao trong Linux không?

+0

Xem câu hỏi này: http://stackoverflow.com/questions/700392/high-resolution-timing-part- mã số của bạn –

Trả lời

34

Kiểm tra clock_gettime, là giao diện POSIX cho bộ hẹn giờ có độ phân giải cao.

Nếu, sau khi đọc manpage, bạn lại tự hỏi về sự khác biệt giữa CLOCK_REALTIMECLOCK_MONOTONIC, xem Difference between CLOCK_REALTIME and CLOCK_MONOTONIC?

Xem trang sau cho một ví dụ hoàn chỉnh: http://www.guyrutenberg.com/2007/09/22/profiling-code-using-clock_gettime/

+0

Chỉ vì vậy tôi rõ ràng về những gì tôi đã đọc, bạn có thể cho tôi một ví dụ về cách bạn sẽ sử dụng clock_gettime để tìm thời gian trôi qua trong nano giây không? – sj755

+0

@ seljuq70: Tôi đã thêm liên kết vào một ví dụ hoàn chỉnh. – NPE

+0

Điều đó nên làm điều đó cảm ơn !!! – sj755

-1
+0

'clock_gettime' là thích hợp hơn vì nó giúp bạn nano giây. –

1
struct timespec t; 
clock_gettime(CLOCK_REALTIME, &t); 

cũng có CLOCK_REALTIME_HR, nhưng tôi không chắc liệu nó có tạo ra sự khác biệt nào hay không ..

+0

Và tôi không chắc chắn nếu 'CLOCK_REALTIME_HR' được hỗ trợ. [Câu hỏi] (https://stackoverflow.com/questions/46094769/clock-realtime-nanosecond-precision-support-in-kernel). – gsamaras

0

Bạn có quan tâm đến thời gian tường (bao nhiêu thời gian thực sự trôi qua) hoặc đếm chu kỳ (bao nhiêu chu kỳ)? Trong trường hợp đầu tiên, bạn nên sử dụng một cái gì đó như gettimeofday.

Bộ hẹn giờ có độ phân giải cao nhất sử dụng hướng dẫn lắp ráp RDTSC x86. Tuy nhiên, điều này đo các dấu tích đồng hồ, vì vậy bạn nên chắc chắn rằng chế độ tiết kiệm năng lượng bị tắt.

Các trang wiki cho TSC đưa ra một vài ví dụ: http://en.wikipedia.org/wiki/Time_Stamp_Counter

+0

Trên CPU hiện đại, 'rdtsc' tương quan 1: 1 với thời gian đồng hồ treo tường, không phải là chu kỳ xung nhịp.Nó không dừng lại khi quá trình của bạn (hoặc toàn bộ CPU) đang ngủ, và nó chạy ở tần số không đổi bất kể turbo/tiết kiệm năng lượng. Sử dụng bộ đếm hiệu suất để đo chu kỳ xung nhịp thực tế. ví dụ. 'perf stat awk' BEGIN {cho (i = 0; i <10000000; i + +) {}} ''. –

18

Để tóm tắt thông tin trình bày cho đến nay, đây là hai chức năng cần thiết cho các ứng dụng điển hình.

#include <time.h> 

// call this function to start a nanosecond-resolution timer 
struct timespec timer_start(){ 
    struct timespec start_time; 
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start_time); 
    return start_time; 
} 

// call this function to end a timer, returning nanoseconds elapsed as a long 
long timer_end(struct timespec start_time){ 
    struct timespec end_time; 
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end_time); 
    long diffInNanos = (end_time.tv_sec - start_time.tv_sec) * (long)1e9 + (end_time.tv_nsec - start_time.tv_nsec); 
    return diffInNanos; 
} 

Dưới đây là ví dụ về cách tính thời gian tính toán phương sai của danh sách đầu vào.

struct timespec vartime = timer_start(); // begin a timer called 'vartime' 
double variance = var(input, MAXLEN); // perform the task we want to time 
long time_elapsed_nanos = timer_end(vartime); 
printf("Variance = %f, Time taken (nanoseconds): %ld\n", variance, time_elapsed_nanos); 
+6

Bạn không bỏ qua 'tv_sec' của' timespec'? Ngoài ra, tại sao 'CLOCK_PROCESS_CPUTIME_ID' thay vì' CLOCK_MONOTONIC'? – amaurea

+0

Áp phích này đang so sánh hiệu suất của CPU với GPU. Bạn đang trung thực cho mã nhận được thời gian CPU. CLOCK_PROCESS_CPUTIME_ID. Điều này có nghĩa là anh ta sẽ tăng tốc độ nhiều đơn đặt hàng của cường độ. Đối với hiệu suất CPU/GPU (câu hỏi này) luôn luôn sử dụng thời gian tường. Xóa câu trả lời này. – TimZaman

+1

@TimZaman Yep, thời gian thực có thể tốt hơn trong trường hợp sử dụng của người đăng. Mặc dù vậy, tôi sẽ không nhận ra câu trả lời, rõ ràng mọi người đã thấy nó hữu ích. Chúc mừng. – Alex

0

epoll implemention: https://github.com/ielife/simple-timer-for-c-language

sử dụng như thế này:

timer_server_handle_t *timer_handle = timer_server_init(1024); 
if (NULL == timer_handle) { 
    fprintf(stderr, "timer_server_init failed\n"); 
    return -1; 
} 
ctimer timer1; 
    timer1.count_ = 3; 
    timer1.timer_internal_ = 0.5; 
    timer1.timer_cb_ = timer_cb1; 
    int *user_data1 = (int *)malloc(sizeof(int)); 
    *user_data1 = 100; 
    timer1.user_data_ = user_data1; 
    timer_server_addtimer(timer_handle, &timer1); 

    ctimer timer2; 
    timer2.count_ = -1; 
    timer2.timer_internal_ = 0.5; 
    timer2.timer_cb_ = timer_cb2; 
    int *user_data2 = (int *)malloc(sizeof(int)); 
    *user_data2 = 10; 
    timer2.user_data_ = user_data2; 
    timer_server_addtimer(timer_handle, &timer2); 

    sleep(10); 

    timer_server_deltimer(timer_handle, timer1.fd); 
    timer_server_deltimer(timer_handle, timer2.fd); 
    timer_server_uninit(timer_handle); 
Các vấn đề liên quan