Энергопотребление кода OpenCL, работающего на графическом процессоре NVIDIA
456
a_sid
Я пытаюсь запустить код OpenCL для декодера MJPEG на графическом процессоре Nvidia (Tesla K20c). Я задавал вопросы на других сайтах по обмену стеками о реализации декодера на графическом процессоре, и сейчас я пытаюсь рассчитать энергопотребление каждого отдельного ядра OpenCL, работающего на Tesla K20c. (Я перевел 4 последовательные функции C, а именно iqzz, IDCT, повышающую дискретизацию и преобразование цветов в ядра OpenCL).
Я использовал nvidia-smiдля проверки питания, потребляемого графическим процессором, когда я запускаю свой код OpenCL. Потребляемая мощность холостого хода K20c составляет 17 Вт, когда код не запускается.
Я использовал следующий метод, чтобы проверить мощность каждого отдельного ядра:
Чтобы рассчитать энергопотребление конкретного ядра OpenCL, я закомментировал оставшиеся ядра OpenCL и позволил их эквивалентным версиям C работать на их месте. Я делал это, чтобы код работал правильно. Следовательно, когда я хочу запустить другое ядро OpenCL, я активирую (раскомментирую) однопоточные версии C других ядер.
Каждое отдельное ядро, мощность которого я хотел проверить вышеописанным способом, потребляло мощность в диапазоне приблизительно от 49 до 55 Вт. Ядро для функции Upsampling потребляло наибольшее количество энергии (55 Вт).
Более того, я считаю, что если я запускаю все ядра OpenCL одновременно на графическом процессоре, общее значение потребляемой мощности должно быть суммой значений, которые я получил, когда запускал каждое ядро отдельно. Вместо этого общее энергопотребление, когда я запускал все ядра одновременно, составило 54,83 Вт! Потребляемая мощность даже ниже, чем мощность, потребляемая ядром для Upsampling.
Есть ли у вас какие-либо предложения для правильного расчета мощности, потребляемой каждым ядром в моем коде OpenCL? В большинстве исследовательских работ (например, в этой ) упоминаются причудливые методы, такие как подключение зондов к шине PCI, процессору и графическому процессору. Однако у меня есть закрытая система, и я не могу использовать физические средства для измерения мощности.
Сложение:
Процент использования графического процессора достиг 98%, когда я однажды добавил printfоператоры в одно из своих ядер.
55 по сравнению с 54,83 для меня звучит как ошибка измерения. Почему необоснованно, что полная реализация графического процессора потребляет 54,83 Вт? K20C имеет 2496 ядер. Если вы запускаете одно ядро, то одно ядро будет работать на всех ядрах. Запустите два ядра, и они поделятся этими 2496 ядрами. В любом случае только 2496 ядер работают в любой момент времени. Чтобы проверить свою методику измерения, отправьте ядра с различным количеством потоков (начиная с << core count of gpu) и посмотрите, как оно увеличивается. Между ядрами будет небольшая разница из-за пропускной способности памяти, но в какой-то момент вы будете насыщать GPU.
sebf 6 лет назад
1
@sebf Я понимаю, что GPU может быть насыщенным (см. добавление, которое я сделал к вопросу). Я не понимаю, что вы подразумеваете под _55 по сравнению с 54,83 для меня как ошибка измерения ._
a_sid 6 лет назад
0
@sebf Потребляемая мощность, которую `nvidia-smi`, вероятно, включает в себя мощность, потребляемую другими окружающими компонентами (шиной, рельсами и т. д.). Как рассчитать ** энергопотребление ядра **?
a_sid 6 лет назад
0
Я имею в виду, что разница в 170 мВт может не означать, что одна только повышающая дискретизация потребляет больше энергии, чем все ядра, но каждый раз, когда вы измеряете ее, измерения меняются более чем на 170 мВт. Вы можете попробовать запустить ваши ядра с различными значениями числа потоков, начиная с 1, построить их и найти кусочно-линейную область (если таковая существует), а градиент может приблизиться к энергопотреблению всего одного вызова ядра.
sebf 6 лет назад
2
1 ответ на вопрос
0
trapezoid
nvidia-smi возвращает информацию о потреблении энергии для всего графического процессора, который, я думаю, не сможет дать вам желаемую степень детализации.
Потребление энергии для «отдельного ядра» не имеет большого смысла в этом контексте; GPU будет включен и потреблять некоторое количество энергии, независимо от того, что вы используете на нем. (Этот номер должен быть вашим базовым показателем для потребления энергии.)
Число 54,83 Вт, которое вы указали, означает, что ваше ядро потребляет меньше энергии, чем повышающая дискретизация, что имеет смысл, поскольку повышающая дискретизация является очень дорогостоящей операцией и легко сожжет на 170 мВт больше энергии.
(Измерение в режиме ожидания 17 Вт вводит в заблуждение, потому что чипсет, вероятно, находится в некотором состоянии приостановки ACPI, когда части чипа полностью отключены, что допускает «ненормально» низкое энергопотребление, которого вы никогда не сможете достичь при работающем ядре.)
54,83 Вт - это энергопотребление, которое я получаю, когда запускаю ** ВСЕ ** ядра на графическом процессоре (** включая ** повышение частоты дискретизации).
a_sid 6 лет назад
0