2015-03-15 4 views
1

фон:Сроки ядра cuda изнутри ядра?

У меня есть ядро, которое я измерить с окнами QPC (скорость клеща 264 наносекунд) в 4 мс. Но я дружеский спор с коллегой, работающим над моим ядром, который утверждает, что занимает 15 мс + (мы оба делаем это после разминки с Tesla K40). Я подозреваю, что его проблема связана с пользовательскими RHEL, пользовательскими драйверами cuda и его группами потоков в реальном времени, но я не эксперт по Linux. Я знаю, что оконные часы менее совершенны, но это слишком большое расхождение. (кроме того, все наши сроки других ядер, которые я написал, согласуются с его временем, это только первый в цепочке ядер, что время не согласуется). Меня пахнет чем-то вне ядра.

вопрос:

Во всяком случае есть способ с CudeDeviceEvents (прошедшее время), чтобы добавить к CUDA ядра для измерения полного времени ядра с момента, когда первый блок начинается с конца последнего блока? Я думаю, что это заставило нас начать выяснять, где проблема. Из моего чтения, похоже, что события cuda устройства выполняются на хосте, и я ищу что-то внутреннее для gpu.

+2

Профилировщик CUDA должен быть в состоянии дать вам точную оценку времени выполнения чистого ядра. Для этого случая вы можете просто использовать минимальный профилировщик, встроенный в драйвер. Экспортируйте переменную среды 'CUDA_PROFILE = 1', запустите приложение, а затем просмотрите сгенерированный файл журнала. Обязательно отключите переменную среды профайлера, как только вы закончите с измерениями. – njuffa

+0

Прежде чем погрузиться глубоко в профилировщик, вы можете сказать мне, что он внутренне выполняет (а) эмуляцию PTX, (b) статистическую выборку для синхронизации (c) вставки кода, которая выводит материал в журналы. Это три основных способа работы профилировщиков, но каждый из них имеет разное влияние на сроки, и в нашем случае мы не имеем дело с классической проблемой, связанной с вычислением, а с проблемой, связанной с данными, и будет иметь значение, каким образом дела идут. –

+0

Я не знаю внутренних работ профилировщика, но это не (а). PTX представляет собой промежуточное представление кода. Он скомпилирован в машинный код (SASS), который выполняется на графическом процессоре. Профилировщик может рассказать вам о свойствах доступа к памяти в коде на основе счетчиков производительности HW. Существует несколько простых стратегий для ядер, связанных с памятью, руководство для лучшей практики должно быть хорошей отправной точкой. – njuffa

ответ

2

Единственный способ полностью выполнить выполнение всего ядра - использовать функции clock() и clock64(), которые покрыты в the programming guide.

Поскольку эти функции обрабатывают счетчик для каждого мультипроцессора, а AFAIK не существует определенной связи между этими счетчиками от одного SM к другому, нет способа определить использование этих функций в одиночку, какой поток/warp/block является " сначала «выполнить» и «последний» выполнить, если ваш GPU имеет более 1 SM. (Даже если бы существовали определенные отношения, такие как «все они гарантированы одинаковым значением в любом заданном цикле», вам все равно понадобятся дополнительные строительные леса, как указано ниже.)

Хотя вы могли бы создать несколько дополнительных лесов в вашем коде, чтобы попытаться найти общее время выполнения (возможно, добавив в атомику, чтобы выяснить, какой поток/warp/block является первым и последним), все еще могут быть функциональные пробелы в методе. Учитывая сложность, кажется, что лучший метод, основанный на том, что вы описали, - это просто использовать профилировщики, как обсуждалось в @njuffa в комментариях. Любой из профилировщиков может предоставить вам время выполнения ядра на любой поддерживаемой платформе с тривиальным набором команд.

+0

Полезный совет, и говорит мне, что я спускаюсь вниз. Я добавил вопрос к тому, что написал @njuffa. –

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