2012-05-14 52 views
16

Tôi muốn đo thời gian hạt nhân bên trong của GPU, làm thế nào để đo lường nó trong NVIDIA CUDA? ví dụ:Làm thế nào để đo thời gian hạt nhân bên trong trong NVIDIA CUDA?

__global__ void kernelSample() 
{ 
    some code here 
    get start time 
    some code here 
    get stop time 
    some code here 
} 
+0

Amin, (một vài năm trước) bạn chấp nhận câu trả lời là thông tin hữu ích nhưng không trả lời câu hỏi thực tế của bạn. Bạn có phiền không chấp nhận hoặc chỉnh sửa câu hỏi để phản ánh câu trả lời có thể? – einpoklum

Trả lời

5

Hãy thử điều này, nó đo thời gian giữa 2 sự kiện theo mili giây.

cudaEvent_t start, stop; 
    float elapsedTime; 

    cudaEventCreate(&start); 
    cudaEventRecord(start,0); 

//Do kernel activity here 

cudaEventCreate(&stop); 
cudaEventRecord(stop,0); 
cudaEventSynchronize(stop); 

cudaEventElapsedTime(&elapsedTime, start,stop); 
printf("Elapsed time : %f ms\n" ,elapsedTime); 
+19

Mã đó không thể được sử dụng bên trong một hạt nhân, đó là những gì câu hỏi được yêu cầu. – talonmies

+0

@talonmies: Vì vậy, câu trả lời này không trả lời câu hỏi nhưng được chấp nhận. Chúng ta nên làm gì? Chỉnh sửa câu hỏi có thể? – einpoklum

+0

Chạy hạt nhân trong các chuỗi mở trên nhiều gpus và mã này cho tôi kết quả 0 ms – newbieee

33

Bạn có thể làm một cái gì đó như thế này:

__global__ void kernelSample(int *runtime) 
{ 
    // .... 
    clock_t start_time = clock(); 
    //some code here 
    clock_t stop_time = clock(); 
    // .... 

    runtime[tidx] = (int)(stop_time - start_time); 
} 

Mà cho số chu kỳ đồng hồ giữa hai cuộc gọi. Hãy cẩn thận một chút mặc dù, bộ đếm thời gian sẽ tràn sau một vài giây, vì vậy bạn nên chắc chắn rằng thời lượng mã giữa các cuộc gọi liên tiếp là khá ngắn. Bạn cũng nên lưu ý rằng trình biên dịch và trình biên dịch thực hiện việc sắp xếp lại lệnh để bạn có thể muốn kiểm tra xem các cuộc gọi đồng hồ không được đặt cạnh nhau trong đầu ra SASS (sử dụng cudaobjdump để kiểm tra).

+0

Tôi kiểm tra và Không hoạt động đúng cách. clock() là chức năng chủ, không phải chức năng của thiết bị. – Amin

+5

'clock()' ** là ** một chức năng thiết bị và nó thực sự hoạt động. Xem phần B10 của hướng dẫn lập trình CUDA để biết mô tả về 'clock()' và 'clock64()'. Nếu nó "không hoạt động đúng" bạn đang làm điều gì sai hoặc đã hiểu lầm ý nghĩa của đầu ra. – talonmies

+0

Đầu ra là chu kỳ đồng hồ. Làm thế nào để chuyển đổi sang giây? – Amin

Các vấn đề liên quan