Рассмотрим следующее ядро
__global__ void elementAccess( int *a, int N )
{
int i = blockDim.x * blockIdx.x + threadIdx.x;
int z = a[ i ];
}
Который называется
cudaEvent_t start, stop;
float elapsedTime;
cudaEventCreate(&start);
cudaEventRecord(start,0);
elementAccess<<< 1, 1>>>( d_A, 1 );
cudaEventCreate(&stop);
cudaEventRecord(stop,0);
cudaEventSynchronize(stop);
cudaEventElapsedTime(&elapsedTime, start,stop);
printf("Elapsed time : %f ms\n" ,elapsedTime);
Где d_A
— массив целых чисел.
Когда я запускаю код в терминале, я вижу
Elapsed time : 0.015328 ms
Когда я профилирую его с помощью nvprof --metrics SOME_METRICS -o e.nvvp ./element_access
, я вижу, что продолжительность ядра составляет 2.95 us
.
Итак, почему события часов говорят, что время выполнения ядра составляет 15 мкс, а nvvp говорит, что это 2,95 мкс?
Это две разные вещи? Или чего-то еще не хватает?
1 ответ
Ваше первое измерение (основанное на истекшем времени) включает накладные расходы на запуск ядра. Второй (на основе событий CUDA) в основном исключает накладные расходы на запуск.
Учитывая, что ваше ядро абсолютно ничего не делает (одна загрузка памяти будет оптимизирована из-за отсутствия последующего использования значения), кажется разумным, что истекшее время почти полностью состоит из служебных данных запуска.
Похожие вопросы
Новые вопросы
cuda
CUDA (Compute Unified Device Architecture) - это платформа параллельных вычислений и модель программирования для графических процессоров NVIDIA (графических процессоров). CUDA предоставляет интерфейс для графических процессоров NVIDIA через различные языки программирования, библиотеки и API.
cudaEventCreate
может влиять на это. Вы не должны делать это в регионе синхронизации. Создайте все свои мероприятия перед выполнением любой операцииcudaEventRecord
.cudaEventRecord(start,0); /* kernel */; cudaEventRecord(stop,0);
занимает примерно столько же времени. Около 15us.