Как рассчитать общее время для CPU + GPU - PullRequest
1 голос
/ 20 января 2012

Я выполняю некоторые вычисления на процессоре, а затем переношу числа в графический процессор и поработаю там.Я хочу рассчитать общее время, затрачиваемое на выполнение вычислений на CPU + GPU.как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 21 января 2012

Таймер C включается независимо от того, работает графический процессор или нет.Если вы мне не верите, то проведите небольшой эксперимент: создайте цикл for с 1000 итерациями по GPU_Function_Call.Поместите любой таймер C вокруг этого для цикла.Теперь, когда вы запустите программу (предположим, что функция GPU занимает значительное время, например, 20 мс), вы увидите, что она работает в течение нескольких секунд невооруженным глазом, прежде чем она вернется.Но когда вы напечатаете время C, вы заметите, что оно покажет вам несколько миллисекунд.Это связано с тем, что таймер C не ожидал 1000 вызовов MemcpyHtoD, 1000 MemcpyfromDtoH и 1000 вызовов ядра.

Я предлагаю использовать Таймер событий CUDA или даже лучше NVIDIA Visual Profiler для измерения времени на GPU и использования секундомера (увеличьте количество итераций, чтобы уменьшить человеческую ошибку), чтобыизмерить полное время.Затем просто вычтите время GPU из общего количества, чтобы получить время CPU.

0 голосов
/ 20 января 2012

Когда ваша программа запускается, в main () используйте любой системный таймер для записи времени.Когда ваша программа заканчивается в нижней части main (), используйте тот же системный таймер для записи времени.Возьмите разницу между временем2 и временем1.Вот и все!

Существуют различные системные таймеры, которые вы можете использовать, некоторые с более высоким разрешением, чем другие.Вместо того чтобы обсуждать их здесь, я бы предложил вам поискать «системный таймер» на SO-сайте.Если вам нужен какой-либо системный таймер, gettimeofday () работает в системах Linux, но он был заменен более новыми, более точными функциями.Таким образом, gettimeofday () измеряет только время в микросекундах, которое должно быть достаточно для ваших нужд.

Если вы не можете получить таймер с достаточно хорошим разрешением, рассмотрите возможность многократного запуска вашей программы в цикле,хронометраж выполнения цикла и деление измеренного времени на количество итераций цикла.

РЕДАКТИРОВАТЬ:

Системные таймеры могут использоваться для измерения общей производительности приложения, включая время, используемое во время графического процессорарасчет.Обратите внимание, что использование системных таймеров таким образом относится только к реальному или настенному времени, а не к процессу.Измерения, основанные на времени настенных часов, должны включать время, затраченное на ожидание завершения операций графического процессора.

Если вы хотите измерить время, затраченное ядром графического процессора, у вас есть несколько вариантов.Во-первых, вы можете использовать Compute Visual Profiler для сбора различной информации о профилировании, и хотя я не уверен, что он сообщает время, он должен это делать (это базовая функция профилирования).Другие профилировщики - на ум приходит PAPI - предлагают поддержку ядер CUDA.

Другой вариант - использовать события CUDA для записи времени.Пожалуйста, обратитесь к Руководству по программированию CUDA 4.0, где обсуждается использование событий CUDA для измерения времени.

Еще один вариант - использовать системные таймеры, обернутые вокруг вызовов ядра GPU.Обратите внимание, что, учитывая асинхронный характер возвратов вызовов ядра, вам также нужно будет выполнить вызов ядра с помощью вызова синхронизации GPU на стороне хоста, такого как cudaThreadSynchronize (), чтобы этот метод был применим.Если вы выберете эту опцию, я настоятельно рекомендую вызывать ядро ​​в цикле, синхронизируя цикл + одну синхронизацию в конце (поскольку синхронизация происходит между вызовами ядра, не выполняющимися в разных потоках, cudaThreadSynchronize () не требуется внутри цикла),и деление на количество итераций.

...