2013-08-08 1 views
0

* Это более конкретный, более корректный вопрос о том, что я уже задал. Я удалил другой.Как получить синхронизацию ядра ядра NSight от петли

Так что я пытаюсь собрать ядро ​​синхронизации данных из библиотеки CUDA ...

Библиотеки имеют ориентиры для различных типов для каждого из своих алгоритмов, и они работают так:

Существует 2d, который имеет пары размеров массива & тестовые итерации. Пример:

const int Tests[][2] = { 
    { 10000, 10000 }, 
    { 50000, 5000 }, 
    { 100000, 5000 }, 
    { 200000, 2000 } 
    // ... 
}; 

Тогда в главной будет цикл

// get context ptr 
for(int test = 0; test < numTests; ++test) 
    BenchmarkMyAlg(Tests[test][0], Tests[test][1], *context); 

BenchmarkMyAlg устанавливает данные и все, а затем запускает ядро ​​в цикле (тесты [тест] [1] раза)

Что я хочу сделать, так это получить «CUDA Launch Summary», а именно «среднюю продолжительность выполнения функции устройства в микросекундах» для каждой пары тестовых параметров. То есть для каждой итерации этого цикла в основном.

Как сейчас, я могу получить среднее время для всего основного цикла. Другими словами, я могу получить только одну строку данных NSight после того, как приложение выполнится, и я хочу, чтобы строки данных numSests.

Если в основном протестирован второй, другой алгоритм, NSight сделает еще одну строку данных. например ...

for(int test = 0; test < numTests; ++test) 
    BenchmarkMyAlg(Tests[test][0], Tests[test][1], *context); 

for(int test = 0; test < numTests; ++test) 
    BenchmarkMyOtherAlg(Tests[test][0], Tests[test][1], *context); 

Но опять же, что новая строка данных относится ко всей петле, что дает мне 2 строки данных, когда я хочу 2 * numTests строк данных.

Я пробовал копаться в настройках в NSight, и я также занимался nvprof некоторыми, но я не добился никакого прогресса.

Я думаю, что есть способ, которым я мог бы перекодировать файл так, чтобы NSight распознавал каждую тестовую итерацию как новое/другое ядро, как это происходит при фактическом переключении на другое ядро ​​(как в моем втором примере) , Возможно, инициализируя numTests отдельными ссылками на функцию BenchmarkMyAlg, а затем пропустив их? Я сейчас попробую, и прокомментирую, если я попаду куда угодно.

ответ

0

С помощью nvprof вы должны иметь возможность получать комбинированные результаты (min, max, avg) или трассировку для каждого индивидуального вызова (используя -print-gpu-trace). То, что вы хотите, это нечто среднее между собой, вы хотите сгруппировать тайминги. Это невозможно для инструмента самостоятельно, так как у вашего ядра есть одно имя и, следовательно, он не может различать группы (ему нужно будет проверить аргументы для этого, что будет большими накладными расходами).

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

Другим способом было бы templatise ваше ядро, например, с тестовым номером. Даже если вы фактически не используете аргумент шаблона внутри вашего ядра, он заставит каждый тест иметь другое имя ядра, которое делает агрегацию по умолчанию в nvprof (и nsight) делать то, что вы хотите.

+0

Благодарим за отзыв! Да, после долгого дня возиться, я понял, что нет прямого способа делать то, что я хочу.То, что я закончил, - это вызвать функцию BenchmarkMyAlg только один раз в главном, а пара (размер, итерации) - это аргументы main, которые передаются функции BenchmarkMyAlg. Тогда я могу сделать «nvprof --csv myprog.exe <#elem><#itr> >> output.txt« Тогда я просто запускаю программу для каждого размера, пары итераций; данные присоединяются к этому файлу. Хотя обработка полного следа gpu из цикла была бы намного лучшим способом сделать это. –

+0

Я не думал о шаблоне, хотя это может быть немного проще реализовать, чем полная обработка сообщений ... Но если бы я пошел дальше и сделать парсер для полной трассы gpu, я бы хорошо начал полезная небольшая утилита для того, что я делаю. –

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