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