Как измерить время выполнения каждого блока при использовании CUDA? - PullRequest
4 голосов
/ 24 августа 2010

clock () недостаточно точны.

Ответы [ 3 ]

12 голосов
/ 25 августа 2010

Используйте события CUDA для измерения времени ядра или операций CUDA (memcpy и т. Д.):

// Prepare
cudaEvent_t start, stop;
cudaEventCreate(&start);
cudaEventCreate(&stop);
// Start record
cudaEventRecord(start, 0);
// Do something on GPU
MyKernel<<<dimGrid, dimBlock>>>(input_data, output_data);
// Stop event
cudaEventRecord(stop, 0);
cudaEventSynchronize(stop);
float elapsedTime;
cudaEventElapsedTime(&elapsedTime, start, stop); // that's our time!
// Clean up:
cudaEventDestroy(start);
cudaEventDestroy(stop);

См. Руководство по программированию CUDA, раздел 3.2.7.6

0 голосов
/ 07 января 2015

Я думаю, что long long int clock64 () - это то, что вы ищете?

См. Руководство по программированию Cuda, Расширения языка C, B. 11.

0 голосов
/ 13 июня 2013

Как насчет использования функции clock () в каждом потоке CUDA для вычисления времени начала и окончания. И сохраните его в массиве таким образом, чтобы вы могли выяснить, какой поток запускается / останавливается в какое время, на основе индексов массива, таких как:

__global__ void kclock(unsigned int *ts) {
    unsigned int start_time = 0, stop_time = 0;

    start_time = clock();

    // Code we need to measure should go here.

    stop_time = clock();

    ts[(blockIdx.x * blockDim.x + threadIdx.x) * 2] = start_time;
    ts[(blockIdx.x * blockDim.x + threadIdx.x) * 2 + 1] = stop_time; 
} 

Затем используйте этот массив, чтобы определить минимальное время начала и максимальное время остановки для рассматриваемого блока. Например, вы можете рассчитать диапазон индексов временного массива, который соответствует блоку (0, 0) в CUDA, и использовать мин / макс для вычисления времени выполнения.

...