2012-01-20 4 views
1

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

ответ

0

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

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

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

EDIT:

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

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

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

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

+0

Эти системные таймеры также учитывают время, затрачиваемое на вычисление на графическом процессоре? Я так не думаю ... Между, я хочу, чтобы время раздела кода. Таким образом, просто ввод в начало основного не помогает – Programmer

+0

@Programmer Пожалуйста, проверьте мои изменения. – Patrick87

0

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

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

+0

Ваш первый пункт не является строгим. Да, запуски ядра асинхронны, но стандартный API mempcpy блокируется, поэтому таймер хоста записывает правильное время настенных часов. – talonmies

Смежные вопросы