Я несколько знаком с визуальным профилировщиком CUDA и электронной таблицей заполнения, хотя я, вероятно, не усиливаю их, а также я мог. Профилирование и оптимизация кода CUDA не похожи на профилирование и оптимизацию кода, который работает на ЦП. Таким образом, я надеюсь учиться на Вашем опыте о том, как получить все возможное от моего кода.
Было сообщение, недавно ища самый быстрый код для идентификации сам числа, и я обеспечил реализацию CUDA. Я не удовлетворен, что этот код - то, с такой скоростью, как это может быть, но я в замешательстве для выяснения и что правильные вопросы и от какого инструмента я могу получить ответы.
Как Вы определяете способы заставить Ваши ядра CUDA работать быстрее?
Общее правило должно быть: используйте «это», чтобы избежать двусмысленности, не используйте это, если это очевидно к тому, что вы ссылаетесь.
Например, при программировании на Java не требуется this.getSomeValue ()
, так как все вызовы функций являются вызовами метода «this». С другой стороны, this.myProperty
может быть полезен, если в методе много локальных переменных или если существуют статические переменные члены, и необходимо уточнить, что доступ к переменной экземпляра возможен.
Конечно, иногда «это» неизбежно, как в
void setX(int x){ this.x = x; }
-121--2444738- Я склонен говорить просто использовать дистанционное взаимодействие. Запись данных в файл также требует сериализации. Сериализация кажется почти неизбежной, что когда-либо технологии вы используете. Необходимо перенести данные из одного домена приложения в другой, используя какой-либо канал, и необходимо сериализовать данные, чтобы получить их через канал.
Единственный способ избежать сериализации - использовать общую память, чтобы оба домена приложений могли получить доступ к данным, не проходя канал. Даже глубокое клонирование данных из памяти одного домена приложения в память другого не является более чем двоичной сериализацией (где результат не обязательно хранится в последовательных ячейках памяти).
-121--2242489-Если вы разрабатываете на Linux, то CUDA Visual Profiler дает вам целый груз информации, зная, что с ней делать может быть немного сложно. В Windows также можно использовать CUDA Visual Profiler или (на Vista/7/2008) Nexus, который хорошо интегрируется с Visual Studio и предоставляет объединенную информацию о профиле хоста и графического процессора.
Как только вы получите данные, вы должны знать, как их интерпретировать. Презентация Advanced CUDA C от GTC содержит несколько полезных советов.
Это просто начало, посмотрите презентацию GTC и другие вебинары на сайте NVIDIA.
Я повис, потому что я не эксперт CUDA, и другие ответы По моему опыту, это большая ИФ, и нет никакого вреда в проверке.
Чтобы проверить его, вам нужно выяснить, точно ли код не делает ничего, что он на самом деле не должен делать. Вот как я могу убедиться, что:
Запустите тот же код на ванильном процессоре и либо возьмите stackshots из него, либо используйте профилировщик, такой как Oprofile или RotateRight/Zoom, который может дать вам эквивалентную информацию.
Запустите его на процессоре CUDA и, если возможно, выполните то же самое.
Вы ищете строки кода, которые имеют высокую заполняемость стека вызовов, как показывает часть выборок стека, содержащих их. Это твои «узкие места.» Не требуется очень большое количество образцов, чтобы найти их.
Профилировщик CUDA довольно груб и не предоставляет много полезной информации. Единственный способ серьезно оптимизировать свой код (при условии, что вы уже выбрали наилучший из возможных алгоритмов) - это иметь глубокое понимание архитектуры графического процессора, особенно в отношении использования общей памяти, шаблонов доступа к внешней памяти, использования регистров, занятости потоков. , искажения и т. д.
Может быть, вы могли бы опубликовать здесь свой код ядра и получить отзывы?
Форум разработчиков nVidia CUDA также является хорошим местом, где можно получить помощь в решении подобных проблем. .