#cuda
#cuda
Вопрос:
Я пытаюсь понять метрики nvprof. Я новичок в CUDA и поэтому пытаюсь понять, какие показатели важны для производительности.
Я написал ядро для вычисления суммы абсолютной разности между матрицами.
При запуске на Tegra X1 он составляет в среднем около 47 мс, с 1584 блоками и 1024 потоками на блок.
Запустив nvprof, я получаю эти показатели:
achieved_occupancy Achieved Occupancy 0.982284 0.982284 0.982284
warp_execution_efficiency Warp Execution Efficiency 0.00% 0.00% 0.00%
sm_efficiency Multiprocessor Activity 0.11% 0.11% 0.11%
branch_efficiency Branch Efficiency 100.00% 100.00% 100.00%
ipc Executed IPC 3.600738 3.600738 3.600738
Почему Warp Execution Efficiency
и Multiprocessor Activity
такие низкие, когда другие показатели такие хорошие? Это правильные показатели, на которые следует обращать внимание при профилировании общей производительности ядра, верно?
Комментарии:
1. Я не думаю, что warp_execution_efficiency и sm_efficiency являются правильными. достигнутая_занятость составляет почти 100% (что соответствует ожиданиям, что вы сможете разместить полные 2048 = 64 деформации на SM. Я не могу вспомнить, соответствует ли ipc для SM или для GPU. Давайте предположим, что это для каждого графического процессора. Maxwell SM имеет устойчивый IPC 6,0 * 2 SMs = 12. Минимальная sm_efficiency должна составлять 3,6 / 12 = 30%. Я бы рекомендовал собрать метрики во второй раз. Пожалуйста, опубликуйте результаты и ядро.
Ответ №1:
Хороший ответ здесь, вероятно, включал бы в себя длинное руководство по эффективности выполнения CUDA, методам и целям оптимизации, а также механике nvprof
. Поскольку вы вообще не предоставили никакого кода, он должен быть полностью абстрактным и спекулятивным.
Если вы испытываете трудности с nvprof
концепциями оптимизации CUDA, вам может быть полезнее поэкспериментировать с nvvp
визуальным профилировщиком, который включает в себя множество управляемых аналитических, пояснительных, справочных и экспертных систем.
Для начала рассмотрим только один из ваших вопросов, sm_efficiency
относится к проценту времени, в течение которого SM имеет одно или несколько активных искажений. Поскольку ваш sm_efficiency
уровень довольно низок, может показаться, что большую часть времени SM (ы) в целом находится в состоянии ожидания — он не выдает инструкции. Если мы сравним это с заполняемостью, например, это почти ортогональные понятия. Заполняемость относится, грубо говоря, к тому, сколько деформаций находится в SM. Если SM имеет «полный набор» искажений, то заполняемость будет высокой.
Что касается вашего вопроса о том, являются ли они «правильными показателями», «правильные показатели» должны следовать одной из 2 траекторий:
-
убедитесь, что основные цели оптимизации были достигнуты. Для CUDA самые основные из них связаны с наличием достаточного параллелизма и эффективным использованием подсистем памяти. Например, ни одна из выбранных вами метрик не связана с эффективным использованием памяти.
-
траектория оптимизации, основанная на анализе, то есть такая, которая направлена на установление ограничений производительности. Существуют различные презентации, которые охватывают эти идеи, которые вы можете поискать. Если вы выполните поиск в Google по «gtc cuda optimization», вы найдете презентации, которые хорошо раскрывают основные методы оптимизации CUDA, измерения производительности и оптимизации на основе анализа.
Помечаю это как CW — другие могут пожелать добавить свои мысли или лучшие практики.