Не удалось разрешить NVIDIA / nvprof ERR_NVGPUCTRPERM с NVreg_RestrictProfilingToAdminUsers=0

Символ TAB— это управляющий символ, который при отправке на терминал¹ останавливает курсор терминала на следующей вкладке -. По умолчанию в большинстве терминалов позиции табуляции разделены 8 столбцами, но это можно настроить.

Вы также можете располагать позиции табуляции через неравные интервалы:

$ tabs 3 9 11; printf '\tx\ty\tz\n'
  x     y z

Только терминал знает, на сколько столбцов вправо TAB переместит курсор.

Вы можете получить эту информацию, запросив положение курсора с терминала до и после отправки вкладки.

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

  • знать, где вкладка -останавливается²
  • знать ширину отображения каждого символа
  • узнать ширину экрана
  • решить, хотите ли вы обрабатывать другие управляющие символы, такие как \r(, который перемещает курсор в первый столбец )или \b, который перемещает курсор назад...)

Это можно упростить, если предположить, что позиции табуляции расположены через каждые 8 ​​столбцов,строка умещается на экране, и нет других управляющих символов или символов (или символов, отличных от -, ), которые ваш терминал не может правильно отобразить.

С GNU wc, если строка сохранена в$line:

width=$(printf %s "$line" | wc -L)
width_without_tabs=$(printf %s "$line" | tr -d '\t' | wc -L)
width_of_tabs=$((width - width_without_tabs))

wc -Lдает ширину самой широкой строки на входе. Он делает это, используя wcwidth(3)для определения ширины символов и предполагая, что позиции табуляции расположены через каждые 8 ​​столбцов.

Для систем, отличных от -GNU, и с теми же предположениями см. подход @Kusalananda . Это даже лучше, так как позволяет указать позиции табуляции, но, к сожалению, в настоящее время не работает с GNUexpand(по крайней мере ), когда ввод содержит многобайтовые символы -или ширину 0 -(, например, объединение символов )или символы двойной ширины -.


¹ однако обратите внимание, что если вы это сделаете stty tab3, дисциплина строки устройства tty возьмет на себя обработку табуляции (преобразует TAB в пробелы на основе собственного представления о том, где может находиться курсор перед отправкой на терминал )и реализовать табуляцию через каждые 8 ​​столбцов. Тестирование в Linux показало, что он правильно обрабатывает символы CR, LF и BS, а также многобайтовые символы UTF -8 (при условии, что iutf8также находится на ), но это все. Предполагается, что все остальные не -управляющие символы (, включая нулевую ширину -, символы двойной ширины -)имеют ширину 1, (очевидно, что )не обрабатывает управляющие последовательности, не переносится должным образом... Это, вероятно, предназначено для терминалов, которые не могут выполнять обработку вкладок.

В любом случае, линейная дисциплина tty должна знать, где находится курсор, и использует описанную выше эвристику, потому что при использовании линейного редактора icanon(, например, когда вы вводите текст для таких приложений, как cat, которые не не реализовывать собственный линейный редактор ), при нажатии TabBackspace ,линейная дисциплина должна знать, сколько символов BS отправить на , стереть этот символ табуляции для отображения. Если вы измените позицию табуляции на (, например tabs 12), вы заметите, что вкладки не стираются должным образом. То же самое, если вы вводите символы двойной ширины -перед нажатием TabBackspace .


² Для этого вы можете отправлять символы табуляции и запрашивать позицию курсора после каждого из них. Что-то вроде:

tabs=$(
  saved_settings=$(stty -g)
  stty -icanon min 1 time 0 -echo
  gawk -vRS=R -F';' -vORS= < /dev/tty '
    function out(s) {print s > "/dev/tty"; fflush("/dev/tty")}
    BEGIN{out("\r\t\33[6n")}
    $NF <= prev {out("\r"); exit}
    {print sep ($NF - 1); sep=","; prev = $NF; out("\t\33[6n")}'
  stty "$saved_settings"
)

Затем вы можете использовать это как expand -t "$tabs", используя решение @Kusalananda.

2
09.09.2019, 18:15
2 ответа

Я думаю, вы просто пропустили всю опцию для файла /etc/modprobe.d/cuda.conf. Попробуйте вместо этого:

options nvidia "NVreg_RestrictProfilingToAdminUsers=0"
2
27.01.2020, 22:24

Если вы не являетесь пользователем root, запустите sudo под своим логином ниже:

systemctl isolate multi-user # Stop the window manager. modprobe -r nvidia_uvm nvidia_drm nvidia_modeset nvidia-vgpu-vfio nvidia sudo setcap cap_sys_admin+ep modprobe nvidia NVreg_RestrictProfilingToAdminUsers=0 ;; add following to /etc/modprobe.d/<.conf> systemctl isolate graphical

Перед установкой или снятием ключа вставляемого модуля следует остановить диспетчер окон и выгрузить все старые модули. После вставки ключа модуля убедитесь, что вы запустили диспетчер окон.

Распечатайте вывод команды от текущего пользователя, где вы запускаете вышеуказанные команды, если вы все еще замечаете ошибку :$ capsh --print|grep -i "cap _sys _admin"

0
27.01.2020, 22:24

Теги

Похожие вопросы