{"id":492348,"date":"2026-08-26T14:46:13","date_gmt":"2026-08-26T14:46:13","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=492348"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=492348","title":{"rendered":"UnixGPUForge, \u0438\u043b\u0438\u00a0\u041a\u0430\u043a\u00a0\u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0434\u0435\u043c\u043e\u043d \u0434\u043b\u044f\u00a0\u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0\u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u043c\u0438 \u0434\u043b\u044f\u00a0Linux"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e\u00a0\u0441\u0432\u043e\u0435\u043c \u043f\u0443\u0442\u0438 \u043a\u00a0\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0434\u0435\u043c\u043e\u043d\u0430 \u0434\u043b\u044f\u00a0\u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0\u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u043c\u0438 (\u043f\u043e\u043a\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u00a0Nvidia).<\/p>\n<p>\u0414\u043b\u044f\u00a0\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u0438 \u043e\u00a0\u0441\u0435\u0431\u0435. \u0414\u043b\u044f\u00a0\u043c\u0435\u043d\u044f Linux\u00a0\u2014 \u043d\u0435\u00a0\u043d\u043e\u0432\u0438\u043d\u043a\u0430, \u043d\u043e\u00a0\u0438 \u043d\u0435\u00a0\u0442\u0430 \u041e\u0421, \u0441\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f \u0434\u043e\u043b\u0433\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0432\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u0435\u0441\u043a\u0442\u043e\u043f\u0430. \u042f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u00a0\u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u043c \u0441\u0442\u0430\u0436\u0435\u043c \u0432\u00a0\u0444\u0438\u043d\u0442\u0435\u0445\u0435, \u0438 \u0441\u00a0Linux \u0440\u0430\u043d\u0435\u0435\u00a0\u0431\u044b\u043b \u0437\u043d\u0430\u043a\u043e\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u043a\u00a0\u0441\u00a0\u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0439 \u041e\u0421. \u041d\u043e\u00a0\u043e\u0434\u043d\u0430\u0436\u0434\u044b \u044f \u0441\u0442\u0430\u043b \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u043c \u00ab\u043b\u0438\u043d\u0443\u043a\u0441\u043e\u0438\u0434\u043e\u043c\u00bb, \u0440\u0435\u0448\u0438\u0432 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a\u00a0\u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u043e\u0439 \u0432\u00a0\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u0438 \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0435. \u042f \u0432\u044b\u0431\u0440\u0430\u043b \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432 \u043d\u0430\u00a0\u043e\u0441\u043d\u043e\u0432\u0435 Arch, \u0430\u00a0\u0438\u043c\u0435\u043d\u043d\u043e CachyOS. \u0418, \u043a\u0430\u043a\u00a0\u0438 \u043c\u043d\u043e\u0433\u0438\u0435, \u043f\u0440\u0438\u00a0\u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u044f \u043b\u044e\u0431\u043b\u044e \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c \u0432\u00a0\u0438\u0433\u0440\u044b.<\/p>\n<h2>\u041c\u043e\u044f \u0431\u043e\u043b\u044c \u043a\u0430\u043a\u00a0\u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044f \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c<\/h2>\n<p>\u042f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441\u00a0\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439: \u043c\u043d\u0435 \u043d\u0435\u0440\u0435\u0434\u043a\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 Goverlay, Nvidia X Server (nvidia\u2011smi) \u0438 \u043f\u0438\u0445\u0430\u0442\u044c \u044d\u0442\u043e \u0432\u0441\u0435 \u0432\u00a0\u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432\u00a0\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u0445 Steam.\u00a0\u041b\u0438\u0431\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u043b\u0430\u0443\u043d\u0447\u0435\u0440\u044b \u043f\u043e\u00a0\u0442\u0438\u043f\u0443 Heroic \u0438\u043b\u0438\u00a0Lutris \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0445\u043e\u0436\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0442\u0430\u043c. \u041a\u0430\u043a\u00a0\u0431\u044b\u0432\u0448\u0435\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e Windows, \u043c\u043d\u0435 \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043a\u0430\u043a\u2011\u0442\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0434\u043b\u044f\u00a0\u0441\u0435\u0431\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b, \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438\u0433\u0440 \u0438 \u043f\u043e\u0434\u0431\u043e\u0440\u0430 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0434\u043b\u044f\u00a0Linux\u2011\u0433\u0435\u0439\u043c\u0438\u043d\u0433\u0430.<\/p>\n<p>\u041c\u043d\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b \u0430\u043f\u043f\u043a\u0438 \u043f\u043e\u00a0\u0442\u0438\u043f\u0443 GreenWithEnvy, LACT \u0438\u043b\u0438\u00a0CoreCtrl. \u041d\u043e\u00a0\u0441\u00a0\u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u043c \u043d\u0430\u00a0Wayland \u043c\u043e\u0433\u0443\u0442 \u0432\u0441\u043f\u043b\u044b\u0442\u044c \u043d\u044e\u0430\u043d\u0441\u044b \u0432\u0440\u043e\u0434\u0435\u00a0\u0436\u0435\u0441\u0442\u043a\u0438\u0445 \u043f\u0440\u0438\u0432\u044f\u0437\u043e\u043a \u043a\u00a0X11. \u042f \u0445\u043e\u0442\u0435\u043b \u0438\u043c\u0435\u0442\u044c \u043f\u043e\u0434\u00a0\u0440\u0443\u043a\u043e\u0439 \u0447\u0442\u043e\u2011\u0442\u043e \u0432\u0440\u043e\u0434\u0435 MSI Afterburner \u0438\u043b\u0438\u00a0\u0434\u0430\u0436\u0435 Nvidia App \u043d\u0430\u00a0Windows, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e\u00a0\u0431\u044b\u043b\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043a\u0430\u043a:<\/p>\n<ul>\n<li>\n<p>\u041a\u0430\u043a\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c DLSS \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043d\u0430\u00a0\u0443\u0440\u043e\u0432\u043d\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0431\u0435\u0437\u00a0\u0442\u0430\u043d\u0446\u0435\u0432 \u0441\u00a0\u0431\u0443\u0431\u043d\u043e\u043c<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u043d\u0430\u00a0\u0443\u0440\u043e\u0432\u043d\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442\u00a0\u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0432\u00a0\u0441\u0430\u043c\u043e\u0439 \u0438\u0433\u0440\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441\u00a0\u043f\u0440\u043e\u0441\u0442\u043e\u044f\u043c\u0438, \u0430\u00a0\u0438\u043c\u0435\u043d\u043d\u043e\u00a0\u2014 \u0438\u0437\u043b\u0438\u0448\u043d\u0435\u0433\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f \u043f\u0438\u0442\u0430\u043d\u0438\u044f \u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u0443\u043b\u0435\u0440\u043e\u0432 \u0431\u0435\u0437\u00a0\u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 (\u043d\u0430 Reddit \u043f\u043e\u0434\u00a0\u043c\u043e\u0438\u043c \u043f\u043e\u0441\u0442\u043e\u043c \u043f\u0438\u0441\u0430\u043b\u0438 \u043e\u00a0\u043a\u0435\u0439\u0441\u0430\u0445 \u0441\u00a0Intel, \u043a\u043e\u0433\u0434\u0430 \u0434\u0430\u0436\u0435 \u0432\u00a0\u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0442\u043e\u0440\u044b \u043c\u043e\u0433\u043b\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f).<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c, \u043e\u0442\u0447\u0430\u0441\u0442\u0438 \u043a\u0430\u043a\u00a0\u0438 \u0432\u00a0LACT, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0431\u0440\u0435\u043d\u0434\u043e\u0432 (\u0437\u0430\u043c\u0435\u0447\u0430\u043b, \u0447\u0442\u043e\u00a0\u0442\u0430\u043c\u00a0\u0431\u044b\u043b\u0438 Nvidia \u0438 Intel). \u042f \u0445\u043e\u0447\u0443 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0432\u00a0\u043e\u0434\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0432\u0441\u0435 \u0442\u0440\u0438 \u0431\u0440\u0435\u043d\u0434\u0430. \u041d\u043e\u00a0\u0441\u00a0\u0443\u0447\u0435\u0442\u043e\u043c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u00a0\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Nvidia \u0441\u0440\u0430\u0437\u0443 \u0438\u043c\u0435\u044e\u0442 \u043d\u0430\u0431\u043e\u0440\u044b \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0434\u043b\u044f\u00a0\u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0\u043a\u0430\u0440\u0442\u0430\u043c\u0438 \u043d\u0435\u00a0\u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u00a0\u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u044e\u0437\u0435\u0440\u0441\u043a\u0438\u0445 \u041f\u041a, \u043d\u043e\u00a0\u0438 \u0432\u00a0\u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u0434\u0430\u0442\u0430\u2011\u0446\u0435\u043d\u0442\u0440\u0430\u0445, \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e\u2011\u0442\u043e \u0443\u043b\u044c\u0442\u0438\u043c\u0430\u0442\u0438\u0432\u043d\u043e\u0435.<\/p>\n<h2>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0438 \u0432\u044b\u0431\u043e\u0440 \u0441\u0442\u0435\u043a\u0430<\/h2>\n<p>\u041d\u0435\u00a0\u0431\u0443\u0434\u0443 \u0441\u043a\u0440\u044b\u0432\u0430\u0442\u044c: \u043f\u0440\u0438\u00a0\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u043b\u0441\u044f \u0418\u0418 \u0434\u043b\u044f\u00a0\u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438\u0437\u00a0\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u00ab\u0437\u0435\u043b\u0435\u043d\u044b\u0445\u00bb \u043f\u043e\u00a0\u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u0430\u043c. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u00a0\u043b\u0438\u0431\u043a\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043f\u043e\u0434\u00a0C++, \u0430\u00a0\u044f \u043f\u0438\u0448\u0443 \u043d\u0430\u00a0C#. \u0422\u0430\u043a\u0436\u0435 \u044f \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e \u0418\u0418 \u0432\u043e\u00a0\u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0435, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0435\u00a0\u0441\u0438\u043b\u0435\u043d, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u043f\u0440\u0438\u0432\u044b\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u00a0\u0431\u044d\u043a\u0435\u043d\u0434\u043e\u043c \u0438 \u043d\u0435\u00a0\u0438\u043c\u0435\u044e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0430\u0432\u044b\u043a\u043e\u0432 \u0434\u043b\u044f\u00a0\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0433\u043e UI. \u041f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0435\u0449\u0438 \u0442\u0430\u043a \u0438\u043b\u0438\u00a0\u0438\u043d\u0430\u0447\u0435 \u0434\u0435\u043b\u0430\u044e \u0441\u0430\u043c. \u0418 \u0434\u0430, \u043f\u043e\u043d\u0430\u0447\u0430\u043b\u0443 \u043c\u043e\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0432\u00a0Git\u00a0\u0431\u044b\u043b \u043e\u0442\u043a\u0440\u043e\u0432\u0435\u043d\u043d\u043e \u043c\u0443\u0441\u043e\u0440\u043d\u044b\u043c\u00a0\u2014 \u0438\u043c\u0435\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0438 \u0441\u0435\u043c\u044c\u044e, \u043d\u0435\u00a0\u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0448\u044c \u0441\u0438\u043b\u044b \u0438 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u00a0\u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0451 \u0432\u044b\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0438 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u0432\u044b\u043b\u043e\u0436\u0438\u0442\u044c =).<\/p>\n<blockquote>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0432\u0438\u0434\u0435\u043b\u0438 \u043f\u043e\u0441\u0442 \u043d\u0430\u00a0Reddit \u043e\u0431\u00a0\u043e\u0431\u043d\u043e\u0432\u0435, \u0442\u043e \u043c\u043e\u0433\u043b\u0438 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0438 \u0433\u043d\u0435\u0432\u043d\u044b\u0435 \u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u044b \u043e\u00a0\u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0435\u0439 \u0432\u00a0\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430. \u0417\u0430\u0440\u0430\u043d\u0435\u0435 \u0441\u043a\u0430\u0436\u0443: \u0445\u0435\u0439\u0442\u0435\u0440\u044b \u0418\u0418\u2011\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u044f \u043b\u044e\u0431\u043b\u044e \u0438 \u0446\u0435\u043d\u044e \u0432\u0430\u0441, \u0432\u0435\u0434\u044c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0432\u0430\u043c \u043f\u043e\u0441\u0442\u044b \u0447\u0430\u0449\u0435 \u0443\u0445\u043e\u0434\u044f\u0442 \u0432\u00a0\u043c\u0430\u0441\u0441\u044b! \u0412\u0430\u0439\u0431\u2011\u043a\u043e\u0434\u0438\u043d\u0433\u00a0\u2014 \u044d\u0442\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u043e (\u0435\u0441\u043b\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u00a0\u0443\u043c\u043e\u043c), \u043d\u043e\u00a0\u0418\u0418 \u043d\u0435\u00a0\u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430. \u041d\u0435\u043b\u044c\u0437\u044f \u0434\u0435\u0433\u0440\u0430\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0434\u043e\u00a0\u0442\u0443\u043f\u0435\u0439\u0448\u0435\u0433\u043e \u0441\u043a\u0430\u0440\u043c\u043b\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0438 \u0432\u0435\u0447\u043d\u044b\u0445 \u043f\u0440\u0430\u0432\u043e\u043a \u043a\u043e\u0434\u0430, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0447\u0435\u0440\u0435\u0437 \u043e\u0434\u0438\u043d \u0418\u0418 \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0440\u0443\u0433\u043e\u0433\u043e.<\/p>\n<\/blockquote>\n<p>\u0418\u0442\u0430\u043a, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044f\u0441\u044c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a\u00a0\u0441\u0430\u043c\u043e\u043c\u0443 \u043f\u0435\u0442\u2011\u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u0438 \u0435\u0433\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u0438: \u043d\u0438\u0436\u0435 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u00a0\u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 UI \u0441\u0435\u0439\u0447\u0430\u0441.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6a5\/98e\/119\/6a598e119ed3f77914f55ed2a0093055.png\" width=\"1080\" height=\"1247\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/6a5\/98e\/119\/6a598e119ed3f77914f55ed2a0093055.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6a5\/98e\/119\/6a598e119ed3f77914f55ed2a0093055.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0412\u00a0\u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c UI \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e Vue.js. \u041f\u043b\u0430\u043d\u00a0\u0431\u044b\u043b \u043f\u0440\u043e\u0441\u0442\u044b\u043c: \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0430\u043f\u043f\u043a\u0443 \u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c HTML \u0441\u00a0\u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c <a href=\"http:\/\/Photino.NET\" rel=\"noopener noreferrer nofollow\">Photino.NET<\/a>. \u041d\u0438\u0436\u0435\u00a0\u2014 \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u00a0\u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u0437\u00a0\u0432\u0435\u0431\u2011\u0432\u0435\u0440\u0441\u0438\u0438 (HTML, CSS, Vue.js) \u0432\u00a0\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043e\u043a\u043d\u0430. \u041e\u043a\u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 GTK3\/GTK4, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432\u00a0Wayland. Photino \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0432\u00a0\u043e\u043a\u043d\u043e \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u0438\u0439 \u0434\u0432\u0438\u0436\u043e\u043a WebKitGTK \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0442\u0443\u0434\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b Vue (\u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0435 \u0434\u0435\u043b\u043e, \u0441\u0431\u0438\u043b\u0436\u0435\u043d\u043d\u044b\u0435 \u0432\u00a0\u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0443\u044e \u043f\u0430\u043f\u043a\u0443 \u0442\u0438\u043f\u0430 <code>dist<\/code> \u0441 <code>index.html<\/code> \u0438 \u043f\u0430\u0440\u043e\u0439 JS\u2011\u0444\u0430\u0439\u043b\u043e\u0432).<\/p>\n<pre><code class=\"cs\">using PhotinoNET;class Program{    [STAThread]    static void Main(string[] args)    {        \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u043e\u043a\u043d\u043e        var window = new PhotinoWindow()            .SetTitle(\"UnixGPUForge\")            .SetSize(800, 600)            \/\/ \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043d\u0430\u0448\u0438 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 Vue-\u0444\u0430\u0439\u043b\u044b            .Load(\"ui\/index.html\");         window.WaitForClose();    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041b\u044e\u0431\u043e\u0439, \u043a\u0442\u043e \u043e\u0442\u043a\u0440\u043e\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442, \u0441\u043f\u0440\u043e\u0441\u0438\u0442, \u043f\u043e\u0447\u0435\u043c\u0443 \u044f \u0432\u044b\u0431\u0440\u0430\u043b.NET. \u041e\u0442\u0432\u0435\u0447\u0443: C#.NET \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u00a0\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 AOT\u2011\u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a, \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e, \u043f\u043b\u044e\u0441 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u00a0\u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 I\/O (\u0447\u0442\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e \u043f\u0440\u0438\u00a0\u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u00a0\u0434\u0430\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b, \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435).<\/p>\n<p>\u0414\u043b\u044f\u00a0\u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0\u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u043c\u0438 \u0438 \u0441\u00a0\u0437\u0430\u0434\u0435\u043b\u043e\u043c \u043d\u0430\u00a0\u0431\u0443\u0434\u0443\u0449\u0435\u0435 \u044f \u0441\u0442\u0440\u043e\u0438\u043b \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043a\u0430\u0440\u0442 \u043d\u0435\u00a0\u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u00a0Nvidia, \u043d\u043e\u00a0\u0438 \u043e\u0442\u00a0AMD \u0438 Intel. \u042f \u043d\u0430\u043a\u0438\u0434\u0430\u043b \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>IGpuProvider<\/code>, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u0438 \u0438 \u0441\u0442\u0435\u0439\u0442\u043e\u0432.<\/p>\n<h2>\u041a\u0430\u043a\u00a0\u044f \u043f\u0438\u0441\u0430\u043b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441\u00a0NVML<\/h2>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043f\u0440\u0438\u00a0\u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u00a0Nvidia \u0443\u00a0\u043c\u0435\u043d\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u00a0\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0435 <code>NvidiaGpuProvider<\/code>. \u0412\u00a0\u043d\u0435\u043c \u0438\u0434\u0435\u0442 \u0438\u043c\u043f\u043e\u0440\u0442 NVML\u00a0\u2014 \u0442\u0430\u043a \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0441\u00a0\u043a\u0430\u0440\u0442\u043e\u0439 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438 \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u044e\u0441\u044c \u043e\u0442\u00a0\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0432\u044b\u0432\u043e\u0434\u044b \u043a\u043e\u043d\u0441\u043e\u043b\u0438 <code>nvidia-smi<\/code>. <\/p>\n<details class=\"spoiler\">\n<summary>\u041d\u0438\u0436\u0435 \u0432\u044b\u043b\u043e\u0436\u0435\u043d \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 (\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043d\u0430\u00a0\u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438).<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">using System.Runtime.InteropServices;using UnixGPUForge.Daemon.Core.Interfaces;using UnixGPUForge.Shared.Models;namespace UnixGPUForge.Daemon.Core.Providers;public partial class NvidiaGpuProvider : IGpuProvider, IDisposable{    private const string NvmlLibrary = \"libnvidia-ml.so\";    private readonly IntPtr _deviceHandle;    [StructLayout(LayoutKind.Sequential)]    private struct nvmlUtilization_t    {        public uint gpu;        public uint memory;    }    [StructLayout(LayoutKind.Sequential)]    private struct nvmlMemory_t    {        public ulong total;        public ulong free;        public ulong used;    }    [StructLayout(LayoutKind.Sequential)]    private struct nvmlProcessInfo_t    {        public uint pid;        public ulong usedGpuMemory;        public uint gpuInstanceId;        public uint computeInstanceId;    }    [LibraryImport(NvmlLibrary, EntryPoint = \"nvmlInit_v2\")]    private static partial int NvmlInit();    [LibraryImport(NvmlLibrary, EntryPoint = \"nvmlShutdown\")]    private static partial int NvmlShutdown();    [LibraryImport(NvmlLibrary, EntryPoint = \"nvmlDeviceGetHandleByIndex_v2\")]    private static partial int NvmlDeviceGetHandleByIndex(uint index, out IntPtr device);    [LibraryImport(NvmlLibrary, EntryPoint = \"nvmlDeviceGetName\", StringMarshalling = StringMarshalling.Utf8)]    private static partial int NvmlDeviceGetName(IntPtr device, IntPtr name, uint length);    [LibraryImport(NvmlLibrary, EntryPoint = \"nvmlDeviceGetTemperature\")]    private static partial int NvmlDeviceGetTemperature(IntPtr device, uint sensorType, out uint temp);    [LibraryImport(NvmlLibrary, EntryPoint = \"nvmlDeviceGetPowerUsage\")]    private static partial int NvmlDeviceGetPowerUsage(IntPtr device, out uint power);    [LibraryImport(NvmlLibrary, EntryPoint = \"nvmlDeviceGetUtilizationRates\")]    private static partial int NvmlDeviceGetUtilizationRates(IntPtr device, out nvmlUtilization_t utilization);    [LibraryImport(NvmlLibrary, EntryPoint = \"nvmlDeviceGetMemoryInfo\")]    private static partial int NvmlDeviceGetMemoryInfo(IntPtr device, out nvmlMemory_t memory);    [LibraryImport(NvmlLibrary, EntryPoint = \"nvmlDeviceGetPowerManagementLimitConstraints\")]    private static partial int NvmlDeviceGetPowerManagementLimitConstraints(IntPtr device, out uint minLimit, out uint maxLimit);    [LibraryImport(NvmlLibrary, EntryPoint = \"nvmlDeviceSetPowerManagementLimit_v2\")]    private static partial int NvmlDeviceSetPowerManagementLimit(IntPtr device, uint limit);    [LibraryImport(NvmlLibrary, EntryPoint = \"nvmlDeviceSetGpuLockedClocks\")]    private static partial int NvmlDeviceSetGpuLockedClocks(IntPtr device, uint minGpuClockMHz, uint maxGpuClockMHz);    [LibraryImport(NvmlLibrary, EntryPoint = \"nvmlDeviceResetGpuLockedClocks\")]    private static partial int NvmlDeviceResetGpuLockedClocks(IntPtr device);    [LibraryImport(NvmlLibrary, EntryPoint = \"nvmlDeviceSetMemoryLockedClocks\")]    private static partial int NvmlDeviceSetMemoryLockedClocks(IntPtr device, uint minMemClockMHz, uint maxMemClockMHz);    [LibraryImport(NvmlLibrary, EntryPoint = \"nvmlDeviceResetMemoryLockedClocks\")]    private static partial int NvmlDeviceResetMemoryLockedClocks(IntPtr device);    [LibraryImport(NvmlLibrary, EntryPoint = \"nvmlDeviceGetGraphicsRunningProcesses_v3\")]    private static partial int NvmlDeviceGetGraphicsRunningProcesses(IntPtr device, ref uint infoCount, [Out] nvmlProcessInfo_t[] infos);    [LibraryImport(NvmlLibrary, EntryPoint = \"nvmlDeviceGetComputeRunningProcesses_v3\")]    private static partial int NvmlDeviceGetComputeRunningProcesses(IntPtr device, ref uint infoCount, [Out] nvmlProcessInfo_t[] infos);    [LibraryImport(NvmlLibrary, EntryPoint = \"nvmlDeviceSetFanSpeed_v2\")]    private static partial int NvmlDeviceSetFanSpeed(IntPtr device, uint fan, uint speed);    [LibraryImport(NvmlLibrary, EntryPoint = \"nvmlDeviceSetDefaultFanSpeed_v2\")]    private static partial int NvmlDeviceSetDefaultFanSpeed(IntPtr device, uint fan);    [LibraryImport(NvmlLibrary, EntryPoint = \"nvmlDeviceGetNumFans\")]    private static partial int NvmlDeviceGetNumFans(IntPtr device, out uint numFans);    public NvidiaGpuProvider()    {        if (NvmlInit() != 0)            throw new Exception(\"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c NVML \u0434\u0440\u0430\u0439\u0432\u0435\u0440.\");        if (NvmlDeviceGetHandleByIndex(0, out _deviceHandle) != 0)            throw new Exception(\"\u0412\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430 NVIDIA \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\");    }    public GpuTelemetry GetTelemetry()    {        IntPtr namePtr = Marshal.AllocHGlobal(96);        string gpuName = \"Unknown GPU\";        if (NvmlDeviceGetName(_deviceHandle, namePtr, 96) == 0)        {            gpuName = Marshal.PtrToStringUTF8(namePtr) ?? gpuName;        }        Marshal.FreeHGlobal(namePtr);        NvmlDeviceGetTemperature(_deviceHandle, 0, out uint temp);        NvmlDeviceGetPowerUsage(_deviceHandle, out uint powerMw);        NvmlDeviceGetUtilizationRates(_deviceHandle, out nvmlUtilization_t util);        NvmlDeviceGetMemoryInfo(_deviceHandle, out nvmlMemory_t mem);        NvmlDeviceGetPowerManagementLimitConstraints(_deviceHandle, out uint minLimitMw, out uint maxLimitMw);        return new GpuTelemetry        {            Name = gpuName,            Temperature = temp,            PowerUsage = powerMw \/ 1000,            CoreLoad = util.gpu,            VramUsed = mem.used \/ (1024 * 1024),            VramTotal = mem.total \/ (1024 * 1024),            MinLimit = minLimitMw \/ 1000,            MaxLimit = maxLimitMw \/ 1000        };    }    public bool SetPowerLimit(uint watts)    {        return NvmlDeviceSetPowerManagementLimit(_deviceHandle, watts * 1000) == 0;    }    public bool SetGpuLockedClocks(uint minMHz, uint maxMHz)    {        return NvmlDeviceSetGpuLockedClocks(_deviceHandle, minMHz, maxMHz) == 0;    }    public bool ResetGpuLockedClocks()    {        return NvmlDeviceResetGpuLockedClocks(_deviceHandle) == 0;    }    public bool SetMemoryLockedClocks(uint minMHz, uint maxMHz)    {        return NvmlDeviceSetMemoryLockedClocks(_deviceHandle, minMHz, maxMHz) == 0;    }    public bool ResetMemoryLockedClocks()    {        return NvmlDeviceResetMemoryLockedClocks(_deviceHandle) == 0;    }    public bool SetFanSpeed(uint fanIndex, uint speedPercent)    {        int result = NvmlDeviceSetFanSpeed(_deviceHandle, fanIndex, speedPercent);        if (result != 0)        {            Console.WriteLine($\"[NVML] \u041e\u0448\u0438\u0431\u043a\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0438\u043d\u0442\u043e\u043c {fanIndex}. \u041a\u043e\u0434 \u043e\u0448\u0438\u0431\u043a\u0438 NVML: {result}\");            return false;        }        return true;    }    public bool ResetFanSpeed(uint fanIndex)    {        return NvmlDeviceSetDefaultFanSpeed(_deviceHandle, fanIndex) == 0;    }    public uint GetFanCount()    {        if (NvmlDeviceGetNumFans(_deviceHandle, out uint fanCount) == 0)        {            return fanCount;        }                return 2;    }    public List&lt;uint&gt; GetRunningPids()    {        var pids = new HashSet&lt;uint&gt;();        var dummy = Array.Empty&lt;nvmlProcessInfo_t&gt;();        uint graphicsCount = 0;        int resGraphics = NvmlDeviceGetGraphicsRunningProcesses(_deviceHandle, ref graphicsCount, dummy);        if (resGraphics == 7 &amp;&amp; graphicsCount &gt; 0)        {            var graphicsInfos = new nvmlProcessInfo_t[graphicsCount];            if (NvmlDeviceGetGraphicsRunningProcesses(_deviceHandle, ref graphicsCount, graphicsInfos) == 0)            {                foreach (var info in graphicsInfos) pids.Add(info.pid);            }        }        uint computeCount = 0;        int resCompute = NvmlDeviceGetComputeRunningProcesses(_deviceHandle, ref computeCount, dummy);        if (resCompute == 7 &amp;&amp; computeCount &gt; 0)        {            var computeInfos = new nvmlProcessInfo_t[computeCount];            if (NvmlDeviceGetComputeRunningProcesses(_deviceHandle, ref computeCount, computeInfos) == 0)            {                foreach (var info in computeInfos) pids.Add(info.pid);            }        }        return pids.ToList();    }    public void Dispose()    {        NvmlShutdown();        GC.SuppressFinalize(this);    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p>\u0415\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u043d\u044e\u0430\u043d\u0441 \u043f\u0440\u0438\u00a0\u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u00a0\u043a\u0443\u043b\u0435\u0440\u0430\u043c\u0438. \u0418\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u043f\u0440\u0438\u0435\u0442\u0430\u0440\u043d\u044b\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 Nvidia \u043c\u043e\u0436\u0435\u0442 \u043d\u0435\u00a0\u043e\u0442\u0434\u0430\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0442\u043e\u0440\u0430\u043c\u0438. \u0414\u043b\u044f\u00a0\u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <code>Coolbits<\/code> \u0432\u00a0\u043a\u043e\u043d\u0444\u0438\u0433 X\u2011\u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043d\u043e\u00a0\u0432\u00a0Wayland \u044d\u0442\u043e \u0448\u0442\u0430\u0442\u043d\u043e \u043d\u0435\u00a0\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 (\u043b\u0438\u0431\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0440\u0438\u0432\u043e\u0432\u0430\u0442\u043e\u00a0\u2014 \u0434\u043e\u00a0\u043a\u043e\u043d\u0446\u0430 \u043f\u043e\u043a\u0430 \u043d\u0435\u00a0\u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0441\u044f). \u041e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044f \u0435\u0449\u0435 \u043d\u0435\u00a0\u043f\u0440\u0438\u043d\u044f\u043b, \u043d\u043e\u00a0\u0432\u0438\u0436\u0443 \u0442\u0430\u043a\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b: \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u0435\u043c\u043e\u043d\u0430 \u043f\u0440\u044f\u043c\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441\u00a0\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c I2C \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b \u0438\u043b\u0438\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0435 \u043e\u0431\u0435\u0440\u0442\u043a\u0438 \u043d\u0430\u0434 NVML \u0441\u00a0API \u0447\u0435\u0440\u0435\u0437 P\/Invoke, \u0447\u0442\u043e\u0431\u044b \u0444\u043e\u0440\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c PWM (\u0428\u0418\u041c\u2011\u0441\u0438\u0433\u043d\u0430\u043b) \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432 \u0432\u00a0\u043e\u0431\u0445\u043e\u0434 \u0434\u0438\u0441\u043f\u043b\u0435\u0439\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430.<\/p>\n<h2>\u041f\u043e\u043f\u044b\u0442\u043a\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h2>\n<p>\u0422\u0430\u043a\u0436\u0435 \u044f \u043f\u0440\u043e\u0431\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f\u00a0\u0438\u0433\u0440. \u0412\u00a0\u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0445\u043e\u0447\u0443 \u043d\u0430\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0438\u043d\u0436\u0435\u043a\u0442\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u00a0\u0440\u0430\u043d\u0442\u0430\u0439\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u043d\u0435\u00a0\u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0438\u0445 \u0440\u0443\u043a\u0430\u043c\u0438 (\u043a\u0430\u043a \u044f \u0441\u0435\u0439\u0447\u0430\u0441 \u0434\u0435\u043b\u0430\u044e \u0447\u0435\u0440\u0435\u0437 Goverlay, \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044f \u043a\u043e\u043d\u0444\u0438\u0433 \u0438 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0435\u0433\u043e \u0432\u00a0Steam \u043a\u0430\u043a\u00a0\u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0437\u0430\u043f\u0443\u0441\u043a\u0430).<\/p>\n<p>\u041d\u043e\u00a0\u044d\u0442\u043e \u043f\u043b\u0430\u043d\u044b. \u0421\u0435\u0439\u0447\u0430\u0441 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043d\u0435\u00a0\u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u0430\u0440\u0442\u044b \u0434\u043b\u044f\u00a0\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u00a0\u043b\u0438\u043c\u0438\u0442\u0430\u043c\u0438 \u043f\u0438\u0442\u0430\u043d\u0438\u044f \u0438 \u0447\u0430\u0441\u0442\u043e\u0442\u0430\u043c\u0438 \u044f\u0434\u0440\u0430\/\u043f\u0430\u043c\u044f\u0442\u0438, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u043a\u043e\u043d\u0444\u0438\u0433 \u0432\u00a0JSON.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">using System.Diagnostics;using System.Text.Json;using UnixGPUForge.Daemon.Core.Interfaces;using UnixGPUForge.Shared.Models;namespace UnixGPUForge.Daemon.Core.Services;public class AutoProfileService : BackgroundService{    private readonly IGpuProvider _gpu;    private readonly ILogger&lt;AutoProfileService&gt; _logger;    private List&lt;GameProfile&gt; _profiles = new();    private string? _activeProfileName = null;    private static readonly object _nvmlLock = new();    public AutoProfileService(IGpuProvider gpu, ILogger&lt;AutoProfileService&gt; logger)    {        _gpu = gpu;        _logger = logger;        LoadProfiles();    }    private void LoadProfiles()    {        try        {            if (File.Exists(\"profiles.json\"))            {                string json = File.ReadAllText(\"profiles.json\");                _profiles = JsonSerializer.Deserialize&lt;List&lt;GameProfile&gt;&gt;(json) ?? new List&lt;GameProfile&gt;();                _logger.LogInformation($\"\u0417\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043e {_profiles.Count} \u043f\u0440\u043e\u0444\u0438\u043b\u0435\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438.\");            }            else            {                \/\/ \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d                _profiles = new List&lt;GameProfile&gt;                {                    new() { ProcessName = \"Cyberpunk2077\", PowerLimit = 300, CoreClock = 2650, MemoryClock = 11200 },                    new() { ProcessName = \"dota2\", PowerLimit = 150, CoreClock = 1800, MemoryClock = 10000 },                    new() { ProcessName = \"HuntGame\", PowerLimit = 280, CoreClock = 2500, MemoryClock = 11200 },                    new() { ProcessName = \"bg3\", PowerLimit = 200, CoreClock = 2000, MemoryClock = 10500 }                };                File.WriteAllText(\"profiles.json\", JsonSerializer.Serialize(_profiles, new JsonSerializerOptions { WriteIndented = true }));            }        }        catch (Exception ex)        {            _logger.LogError($\"\u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 profiles.json: {ex.Message}\");        }    }    protected override async Task ExecuteAsync(CancellationToken stoppingToken)    {        while (!stoppingToken.IsCancellationRequested)        {            try            {                LoadProfiles();                var pids = _gpu.GetRunningPids();                GameProfile? matchedProfile = null;                foreach (var pid in pids)                {                    try                    {                        var process = Process.GetProcessById((int)pid);                        string procName = process.ProcessName.Replace(\".exe\", \"\", StringComparison.OrdinalIgnoreCase);                                                matchedProfile = _profiles.FirstOrDefault(p =&gt;                             procName.Contains(p.ProcessName.Replace(\".exe\", \"\"), StringComparison.OrdinalIgnoreCase));                                                if (matchedProfile != null) break;                    }                    catch (Exception ex)                    {                        _logger.LogError($\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0441 PID {pid}: {ex.Message}\");                    }                }                if (matchedProfile != null &amp;&amp; _activeProfileName != matchedProfile.ProcessName)                {                    _logger.LogInformation($\"[AUTO] \u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0430 \u0438\u0433\u0440\u0430: {matchedProfile.ProcessName}. \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0436\u0435\u043b\u0435\u0437\u0430...\");                    lock (_nvmlLock)                    {                    _gpu.SetPowerLimit(matchedProfile.PowerLimit);                    _gpu.SetGpuLockedClocks(200, matchedProfile.CoreClock);                    _gpu.SetMemoryLockedClocks(400, matchedProfile.MemoryClock);                    }                    _activeProfileName = matchedProfile.ProcessName;                }                else if (matchedProfile == null &amp;&amp; _activeProfileName != null)                {                    _logger.LogInformation(\"[AUTO] \u0418\u0433\u0440\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0430. \u0412\u043e\u0437\u0432\u0440\u0430\u0442 \u043a \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u043c \u0447\u0430\u0441\u0442\u043e\u0442\u0430\u043c...\");                    _gpu.ResetGpuLockedClocks();                    _gpu.ResetMemoryLockedClocks();                                        _activeProfileName = null;                }            }            catch (Exception ex)            {                _logger.LogError($\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432: {ex.Message}\");            }            await Task.Delay(5000, stoppingToken);        }    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<h2>\u041c\u043e\u0438 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/h2>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u0434\u0443\u043c\u0430\u044e \u043d\u0430\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a\u00a0\u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u043c. \u0425\u043e\u0447\u0435\u0442\u0441\u044f \u0432\u043d\u0435\u0434\u0440\u0438\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0444\u0438\u0448\u043a\u0438, \u043a\u0430\u043a\u00a0\u0432\u044b\u0431\u043e\u0440 \u043f\u0440\u0435\u0434\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a DLSS \u0443\u00a0Nvidia (\u0447\u0442\u043e \u043d\u0430\u00a0Windows \u043b\u0435\u0433\u043a\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 Nvidia App), \u0438 \u0432\u00a0\u0446\u0435\u043b\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0435\u0441\u044c \u043d\u0430\u0431\u043e\u0440 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u00ab\u043e\u043a\u043e\u043d\u00bb. \u0421\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e\u00a0\u044d\u0442\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c Linux \u0431\u043e\u043b\u0435\u0435 \u0434\u0440\u0443\u0436\u0435\u043b\u044e\u0431\u043d\u044b\u043c \u043a\u00a0\u0438\u0433\u0440\u0430\u043c.<\/p>\n<p>\u0425\u043e\u0442\u044f \u0441\u0435\u0439\u0447\u0430\u0441 \u0441\u00a0\u0433\u0435\u0439\u043c\u0438\u043d\u0433\u043e\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432\u0441\u0451 \u043c\u0435\u043d\u044c\u0448\u0435, \u043c\u043d\u043e\u0433\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044f\u0442 \u043d\u0430\u00a0Linux \u0438\u043c\u0435\u043d\u043d\u043e \u0437\u0430\u00a0\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e, \u0438 \u0443\u0434\u0438\u0432\u043b\u044f\u044e\u0442\u0441\u044f (\u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u0432\u00a0\u043c\u043e\u0435\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438), \u0447\u0442\u043e\u00a0\u043d\u0435\u00a0\u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c\u00a0\u0436\u0435\u043b\u0435\u0437\u043e \u0442\u0430\u043a\u00a0\u0436\u0435 \u0433\u0438\u0431\u043a\u043e, \u043a\u0430\u043a\u00a0\u043d\u0430\u00a0Windows. \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430\u00a0\u043c\u043e\u0440\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u0441\u043e\u0444\u0442\u0430 \u0432\u00a0\u043b\u044e\u0431\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438, \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435\u00a0\u0432\u0441\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0437\u043d\u0430\u043a\u043e\u043c\u044b \u0441\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c\u0438 \u0443\u0442\u0438\u043b\u0438\u0442\u0430\u043c\u0438 \u0434\u043b\u044f\u00a0Linux.<\/p>\n<p>\u041d\u0438\u0436\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430\u00a0GitHub \u0434\u043b\u044f\u00a0\u0442\u0435\u0445, \u043a\u043e\u043c\u0443 \u0441\u0442\u0430\u043b \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u043f\u0440\u043e\u0435\u043a\u0442. \u042f \u043e\u0442\u043a\u0440\u044b\u0442 \u043a\u00a0\u043a\u0440\u0438\u0442\u0438\u043a\u0435 \u0438 \u0441\u043e\u0432\u0435\u0442\u0430\u043c. \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430\u00a0\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u043d\u0430\u00a0\u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u0440\u0435\u043c\u044f, \u0438 \u043f\u0440\u043e\u0448\u0443 \u043d\u0435\u00a0\u0441\u0443\u0434\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u0433\u043e\u00a0\u2014 \u044d\u0442\u043e \u043c\u043e\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u043e\u043f\u044b\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432.<\/p>\n<p><a href=\"https:\/\/github.com\/omaeou\/UnixGPUForge\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/omaeou\/UnixGPUForge<\/a><\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1074896\/\">https:\/\/habr.com\/ru\/articles\/1074896\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e\u00a0\u0441\u0432\u043e\u0435\u043c \u043f\u0443\u0442\u0438 \u043a\u00a0\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0434\u0435\u043c\u043e\u043d\u0430 \u0434\u043b\u044f\u00a0\u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0\u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u043c\u0438 (\u043f\u043e\u043a\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u00a0Nvidia).\u0414\u043b\u044f\u00a0\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u0438 \u043e\u00a0\u0441\u0435\u0431\u0435. \u0414\u043b\u044f\u00a0\u043c\u0435\u043d\u044f Linux\u00a0\u2014 \u043d\u0435\u00a0\u043d\u043e\u0432\u0438\u043d\u043a\u0430, \u043d\u043e\u00a0\u0438 \u043d\u0435\u00a0\u0442\u0430 \u041e\u0421, \u0441\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f \u0434\u043e\u043b\u0433\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0432\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u0435\u0441\u043a\u0442\u043e\u043f\u0430. \u042f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u00a0\u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u043c \u0441\u0442\u0430\u0436\u0435\u043c \u0432\u00a0\u0444\u0438\u043d\u0442\u0435\u0445\u0435, \u0438 \u0441\u00a0Linux \u0440\u0430\u043d\u0435\u0435\u00a0\u0431\u044b\u043b \u0437\u043d\u0430\u043a\u043e\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u043a\u00a0\u0441\u00a0\u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0439 \u041e\u0421. \u041d\u043e\u00a0\u043e\u0434\u043d\u0430\u0436\u0434\u044b \u044f \u0441\u0442\u0430\u043b \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u043c \u00ab\u043b\u0438\u043d\u0443\u043a\u0441\u043e\u0438\u0434\u043e\u043c\u00bb, \u0440\u0435\u0448\u0438\u0432 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a\u00a0\u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u043e\u0439 \u0432\u00a0\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u0438 \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0435. \u042f \u0432\u044b\u0431\u0440\u0430\u043b \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432 \u043d\u0430\u00a0\u043e\u0441\u043d\u043e\u0432\u0435 Arch, \u0430\u00a0\u0438\u043c\u0435\u043d\u043d\u043e CachyOS. \u0418, \u043a\u0430\u043a\u00a0\u0438 \u043c\u043d\u043e\u0433\u0438\u0435, \u043f\u0440\u0438\u00a0\u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u044f \u043b\u044e\u0431\u043b\u044e \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c \u0432\u00a0\u0438\u0433\u0440\u044b.\u041c\u043e\u044f \u0431\u043e\u043b\u044c \u043a\u0430\u043a\u00a0\u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044f \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c\u042f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441\u00a0\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439: \u043c\u043d\u0435 \u043d\u0435\u0440\u0435\u0434\u043a\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 Goverlay, Nvidia X Server (nvidia\u2011smi) \u0438 \u043f\u0438\u0445\u0430\u0442\u044c \u044d\u0442\u043e \u0432\u0441\u0435 \u0432\u00a0\u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432\u00a0\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u0445 Steam.\u00a0\u041b\u0438\u0431\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u043b\u0430\u0443\u043d\u0447\u0435\u0440\u044b \u043f\u043e\u00a0\u0442\u0438\u043f\u0443 Heroic \u0438\u043b\u0438\u00a0Lutris \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0445\u043e\u0436\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0442\u0430\u043c. \u041a\u0430\u043a\u00a0\u0431\u044b\u0432\u0448\u0435\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e Windows, \u043c\u043d\u0435 \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043a\u0430\u043a\u2011\u0442\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0434\u043b\u044f\u00a0\u0441\u0435\u0431\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b, \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438\u0433\u0440 \u0438 \u043f\u043e\u0434\u0431\u043e\u0440\u0430 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0434\u043b\u044f\u00a0Linux\u2011\u0433\u0435\u0439\u043c\u0438\u043d\u0433\u0430.\u041c\u043d\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b \u0430\u043f\u043f\u043a\u0438 \u043f\u043e\u00a0\u0442\u0438\u043f\u0443 GreenWithEnvy, LACT \u0438\u043b\u0438\u00a0CoreCtrl. \u041d\u043e\u00a0\u0441\u00a0\u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u043c \u043d\u0430\u00a0Wayland \u043c\u043e\u0433\u0443\u0442 \u0432\u0441\u043f\u043b\u044b\u0442\u044c \u043d\u044e\u0430\u043d\u0441\u044b \u0432\u0440\u043e\u0434\u0435\u00a0\u0436\u0435\u0441\u0442\u043a\u0438\u0445 \u043f\u0440\u0438\u0432\u044f\u0437\u043e\u043a \u043a\u00a0X11. \u042f \u0445\u043e\u0442\u0435\u043b \u0438\u043c\u0435\u0442\u044c \u043f\u043e\u0434\u00a0\u0440\u0443\u043a\u043e\u0439 \u0447\u0442\u043e\u2011\u0442\u043e \u0432\u0440\u043e\u0434\u0435 MSI Afterburner \u0438\u043b\u0438\u00a0\u0434\u0430\u0436\u0435 Nvidia App \u043d\u0430\u00a0Windows, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e\u00a0\u0431\u044b\u043b\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043a\u0430\u043a:\u041a\u0430\u043a\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c DLSS \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c.\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043d\u0430\u00a0\u0443\u0440\u043e\u0432\u043d\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0431\u0435\u0437\u00a0\u0442\u0430\u043d\u0446\u0435\u0432 \u0441\u00a0\u0431\u0443\u0431\u043d\u043e\u043c\u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u043d\u0430\u00a0\u0443\u0440\u043e\u0432\u043d\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442\u00a0\u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0432\u00a0\u0441\u0430\u043c\u043e\u0439 \u0438\u0433\u0440\u0435.\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441\u00a0\u043f\u0440\u043e\u0441\u0442\u043e\u044f\u043c\u0438, \u0430\u00a0\u0438\u043c\u0435\u043d\u043d\u043e\u00a0\u2014 \u0438\u0437\u043b\u0438\u0448\u043d\u0435\u0433\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f \u043f\u0438\u0442\u0430\u043d\u0438\u044f \u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u0443\u043b\u0435\u0440\u043e\u0432 \u0431\u0435\u0437\u00a0\u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 (\u043d\u0430 Reddit \u043f\u043e\u0434\u00a0\u043c\u043e\u0438\u043c \u043f\u043e\u0441\u0442\u043e\u043c \u043f\u0438\u0441\u0430\u043b\u0438 \u043e\u00a0\u043a\u0435\u0439\u0441\u0430\u0445 \u0441\u00a0Intel, \u043a\u043e\u0433\u0434\u0430 \u0434\u0430\u0436\u0435 \u0432\u00a0\u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0442\u043e\u0440\u044b \u043c\u043e\u0433\u043b\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f).\u0422\u0430\u043a\u0436\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c, \u043e\u0442\u0447\u0430\u0441\u0442\u0438 \u043a\u0430\u043a\u00a0\u0438 \u0432\u00a0LACT, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0431\u0440\u0435\u043d\u0434\u043e\u0432 (\u0437\u0430\u043c\u0435\u0447\u0430\u043b, \u0447\u0442\u043e\u00a0\u0442\u0430\u043c\u00a0\u0431\u044b\u043b\u0438 Nvidia \u0438 Intel). \u042f \u0445\u043e\u0447\u0443 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0432\u00a0\u043e\u0434\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0432\u0441\u0435 \u0442\u0440\u0438 \u0431\u0440\u0435\u043d\u0434\u0430. \u041d\u043e\u00a0\u0441\u00a0\u0443\u0447\u0435\u0442\u043e\u043c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u00a0\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Nvidia \u0441\u0440\u0430\u0437\u0443 \u0438\u043c\u0435\u044e\u0442 \u043d\u0430\u0431\u043e\u0440\u044b \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0434\u043b\u044f\u00a0\u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0\u043a\u0430\u0440\u0442\u0430\u043c\u0438 \u043d\u0435\u00a0\u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u00a0\u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u044e\u0437\u0435\u0440\u0441\u043a\u0438\u0445 \u041f\u041a, \u043d\u043e\u00a0\u0438 \u0432\u00a0\u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u0434\u0430\u0442\u0430\u2011\u0446\u0435\u043d\u0442\u0440\u0430\u0445, \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e\u2011\u0442\u043e \u0443\u043b\u044c\u0442\u0438\u043c\u0430\u0442\u0438\u0432\u043d\u043e\u0435.\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0438 \u0432\u044b\u0431\u043e\u0440 \u0441\u0442\u0435\u043a\u0430\u041d\u0435\u00a0\u0431\u0443\u0434\u0443 \u0441\u043a\u0440\u044b\u0432\u0430\u0442\u044c: \u043f\u0440\u0438\u00a0\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u043b\u0441\u044f \u0418\u0418 \u0434\u043b\u044f\u00a0\u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438\u0437\u00a0\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u00ab\u0437\u0435\u043b\u0435\u043d\u044b\u0445\u00bb \u043f\u043e\u00a0\u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u0430\u043c. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u00a0\u043b\u0438\u0431\u043a\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043f\u043e\u0434\u00a0C++, \u0430\u00a0\u044f \u043f\u0438\u0448\u0443 \u043d\u0430\u00a0C#. \u0422\u0430\u043a\u0436\u0435 \u044f \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e \u0418\u0418 \u0432\u043e\u00a0\u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0435, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0435\u00a0\u0441\u0438\u043b\u0435\u043d, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u043f\u0440\u0438\u0432\u044b\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u00a0\u0431\u044d\u043a\u0435\u043d\u0434\u043e\u043c \u0438 \u043d\u0435\u00a0\u0438\u043c\u0435\u044e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0430\u0432\u044b\u043a\u043e\u0432 \u0434\u043b\u044f\u00a0\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0433\u043e UI. \u041f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0435\u0449\u0438 \u0442\u0430\u043a \u0438\u043b\u0438\u00a0\u0438\u043d\u0430\u0447\u0435 \u0434\u0435\u043b\u0430\u044e \u0441\u0430\u043c. \u0418 \u0434\u0430, \u043f\u043e\u043d\u0430\u0447\u0430\u043b\u0443 \u043c\u043e\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0432\u00a0Git\u00a0\u0431\u044b\u043b \u043e\u0442\u043a\u0440\u043e\u0432\u0435\u043d\u043d\u043e \u043c\u0443\u0441\u043e\u0440\u043d\u044b\u043c\u00a0\u2014 \u0438\u043c\u0435\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0438 \u0441\u0435\u043c\u044c\u044e, \u043d\u0435\u00a0\u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0448\u044c \u0441\u0438\u043b\u044b \u0438 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u00a0\u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0451 \u0432\u044b\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0438 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u0432\u044b\u043b\u043e\u0436\u0438\u0442\u044c =).\u0415\u0441\u043b\u0438 \u0432\u044b \u0432\u0438\u0434\u0435\u043b\u0438 \u043f\u043e\u0441\u0442 \u043d\u0430\u00a0Reddit \u043e\u0431\u00a0\u043e\u0431\u043d\u043e\u0432\u0435, \u0442\u043e \u043c\u043e\u0433\u043b\u0438 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0438 \u0433\u043d\u0435\u0432\u043d\u044b\u0435 \u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u044b \u043e\u00a0\u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0435\u0439 \u0432\u00a0\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430. \u0417\u0430\u0440\u0430\u043d\u0435\u0435 \u0441\u043a\u0430\u0436\u0443: \u0445\u0435\u0439\u0442\u0435\u0440\u044b \u0418\u0418\u2011\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u044f \u043b\u044e\u0431\u043b\u044e \u0438 \u0446\u0435\u043d\u044e \u0432\u0430\u0441, \u0432\u0435\u0434\u044c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0432\u0430\u043c \u043f\u043e\u0441\u0442\u044b \u0447\u0430\u0449\u0435 \u0443\u0445\u043e\u0434\u044f\u0442 \u0432\u00a0\u043c\u0430\u0441\u0441\u044b! \u0412\u0430\u0439\u0431\u2011\u043a\u043e\u0434\u0438\u043d\u0433\u00a0\u2014 \u044d\u0442\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u043e (\u0435\u0441\u043b\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u00a0\u0443\u043c\u043e\u043c), \u043d\u043e\u00a0\u0418\u0418 \u043d\u0435\u00a0\u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430. \u041d\u0435\u043b\u044c\u0437\u044f \u0434\u0435\u0433\u0440\u0430\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0434\u043e\u00a0\u0442\u0443\u043f\u0435\u0439\u0448\u0435\u0433\u043e \u0441\u043a\u0430\u0440\u043c\u043b\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0438 \u0432\u0435\u0447\u043d\u044b\u0445 \u043f\u0440\u0430\u0432\u043e\u043a \u043a\u043e\u0434\u0430, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0447\u0435\u0440\u0435\u0437 \u043e\u0434\u0438\u043d \u0418\u0418 \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0440\u0443\u0433\u043e\u0433\u043e.\u0418\u0442\u0430\u043a, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044f\u0441\u044c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a\u00a0\u0441\u0430\u043c\u043e\u043c\u0443 \u043f\u0435\u0442\u2011\u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u0438 \u0435\u0433\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u0438: \u043d\u0438\u0436\u0435 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u00a0\u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 UI \u0441\u0435\u0439\u0447\u0430\u0441.\u0412\u00a0\u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c UI \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e Vue.js. \u041f\u043b\u0430\u043d\u00a0\u0431\u044b\u043b \u043f\u0440\u043e\u0441\u0442\u044b\u043c: \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0430\u043f\u043f\u043a\u0443 \u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c HTML \u0441\u00a0\u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c Photino.NET. \u041d\u0438\u0436\u0435\u00a0\u2014 \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u00a0\u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u0437\u00a0\u0432\u0435\u0431\u2011\u0432\u0435\u0440\u0441\u0438\u0438 (HTML, CSS, Vue.js) \u0432\u00a0\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043e\u043a\u043d\u0430. \u041e\u043a\u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 GTK3\/GTK4, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432\u00a0Wayland. Photino \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0432\u00a0\u043e\u043a\u043d\u043e \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u0438\u0439 \u0434\u0432\u0438\u0436\u043e\u043a WebKitGTK \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0442\u0443\u0434\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b Vue (\u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0435 \u0434\u0435\u043b\u043e, \u0441\u0431\u0438\u043b\u0436\u0435\u043d\u043d\u044b\u0435 \u0432\u00a0\u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0443\u044e \u043f\u0430\u043f\u043a\u0443 \u0442\u0438\u043f\u0430 dist \u0441 index.html \u0438 \u043f\u0430\u0440\u043e\u0439 JS\u2011\u0444\u0430\u0439\u043b\u043e\u0432).using PhotinoNET;class Program{    [STAThread]    static void Main(string[] args)    {        \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u043e\u043a\u043d\u043e        var window = new PhotinoWindow()            .SetTitle(&#171;UnixGPUForge&#187;)            .SetSize(800, 600)            \/\/ \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043d\u0430\u0448\u0438 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 Vue-\u0444\u0430\u0439\u043b\u044b            .Load(&#171;ui\/index.html&#187;);         window.WaitForClose();    }}\u041b\u044e\u0431\u043e\u0439, \u043a\u0442\u043e \u043e\u0442\u043a\u0440\u043e\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442, \u0441\u043f\u0440\u043e\u0441\u0438\u0442, \u043f\u043e\u0447\u0435\u043c\u0443 \u044f \u0432\u044b\u0431\u0440\u0430\u043b.NET. \u041e\u0442\u0432\u0435\u0447\u0443: C#.NET \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u00a0\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 AOT\u2011\u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a, \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e, \u043f\u043b\u044e\u0441 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u00a0\u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 I\/O (\u0447\u0442\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e \u043f\u0440\u0438\u00a0\u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u00a0\u0434\u0430\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b, \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435).\u0414\u043b\u044f\u00a0\u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0\u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u043c\u0438 \u0438 \u0441\u00a0\u0437\u0430\u0434\u0435\u043b\u043e\u043c \u043d\u0430\u00a0\u0431\u0443\u0434\u0443\u0449\u0435\u0435 \u044f \u0441\u0442\u0440\u043e\u0438\u043b \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043a\u0430\u0440\u0442 \u043d\u0435\u00a0\u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u00a0Nvidia, \u043d\u043e\u00a0\u0438 \u043e\u0442\u00a0AMD \u0438 Intel. \u042f \u043d\u0430\u043a\u0438\u0434\u0430\u043b \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IGpuProvider, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u0438 \u0438 \u0441\u0442\u0435\u0439\u0442\u043e\u0432.\u041a\u0430\u043a\u00a0\u044f \u043f\u0438\u0441\u0430\u043b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441\u00a0NVML\u0421\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043f\u0440\u0438\u00a0\u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u00a0Nvidia \u0443\u00a0\u043c\u0435\u043d\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u00a0\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0435 NvidiaGpuProvider. \u0412\u00a0\u043d\u0435\u043c \u0438\u0434\u0435\u0442 \u0438\u043c\u043f\u043e\u0440\u0442 NVML\u00a0\u2014 \u0442\u0430\u043a \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0441\u00a0\u043a\u0430\u0440\u0442\u043e\u0439 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438 \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u044e\u0441\u044c \u043e\u0442\u00a0\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0432\u044b\u0432\u043e\u0434\u044b \u043a\u043e\u043d\u0441\u043e\u043b\u0438 nvidia-smi. \u041d\u0438\u0436\u0435 \u0432\u044b\u043b\u043e\u0436\u0435\u043d \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 (\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043d\u0430\u00a0\u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438).using System.Runtime.InteropServices;using UnixGPUForge.Daemon.Core.Interfaces;using UnixGPUForge.Shared.Models;namespace UnixGPUForge.Daemon.Core.Providers;public partial class NvidiaGpuProvider : IGpuProvider, IDisposable{    private const string NvmlLibrary = &#171;libnvidia-ml.so&#187;;    private readonly IntPtr _deviceHandle;    [StructLayout(LayoutKind.Sequential)]    private struct nvmlUtilization_t    {        public uint gpu;        public uint memory;    }    [StructLayout(LayoutKind.Sequential)]    private struct nvmlMemory_t    {        public ulong total;        public ulong free;        public ulong used;    }    [StructLayout(LayoutKind.Sequential)]    private struct nvmlProcessInfo_t    {        public uint pid;        public ulong usedGpuMemory;        public uint gpuInstanceId;        public uint computeInstanceId;    }    [LibraryImport(NvmlLibrary, EntryPoint = &#171;nvmlInit_v2&#187;)]    private static partial int NvmlInit();    [LibraryImport(NvmlLibrary, EntryPoint = &#171;nvmlShutdown&#187;)]    private static partial int NvmlShutdown();    [LibraryImport(NvmlLibrary, EntryPoint = &#171;nvmlDeviceGetHandleByIndex_v2&#187;)]    private static partial int NvmlDeviceGetHandleByIndex(uint index, out IntPtr device);    [LibraryImport(NvmlLibrary, EntryPoint = &#171;nvmlDeviceGetName&#187;, StringMarshalling = StringMarshalling.Utf8)]    private static partial int NvmlDeviceGetName(IntPtr device, IntPtr name, uint length);    [LibraryImport(NvmlLibrary, EntryPoint = &#171;nvmlDeviceGetTemperature&#187;)]    private static partial int NvmlDeviceGetTemperature(IntPtr device, uint sensorType, out uint temp);    [LibraryImport(NvmlLibrary, EntryPoint = &#171;nvmlDeviceGetPowerUsage&#187;)]    private static partial int NvmlDeviceGetPowerUsage(IntPtr device, out uint power);    [LibraryImport(NvmlLibrary, EntryPoint = &#171;nvmlDeviceGetUtilizationRates&#187;)]    private static partial int NvmlDeviceGetUtilizationRates(IntPtr device, out nvmlUtilization_t utilization);    [LibraryImport(NvmlLibrary, EntryPoint = &#171;nvmlDeviceGetMemoryInfo&#187;)]    private static partial int NvmlDeviceGetMemoryInfo(IntPtr device, out nvmlMemory_t memory);    [LibraryImport(NvmlLibrary, EntryPoint = &#171;nvmlDeviceGetPowerManagementLimitConstraints&#187;)]    private static partial int NvmlDeviceGetPowerManagementLimitConstraints(IntPtr device, out uint minLimit, out uint maxLimit);    [LibraryImport(NvmlLibrary, EntryPoint = &#171;nvmlDeviceSetPowerManagementLimit_v2&#187;)]    private static partial int NvmlDeviceSetPowerManagementLimit(IntPtr device, uint limit);    [LibraryImport(NvmlLibrary, EntryPoint = &#171;nvmlDeviceSetGpuLockedClocks&#187;)]    private static partial int NvmlDeviceSetGpuLockedClocks(IntPtr device, uint minGpuClockMHz, uint maxGpuClockMHz);    [LibraryImport(NvmlLibrary, EntryPoint = &#171;nvmlDeviceResetGpuLockedClocks&#187;)]    private static partial int NvmlDeviceResetGpuLockedClocks(IntPtr device);    [LibraryImport(NvmlLibrary, EntryPoint = &#171;nvmlDeviceSetMemoryLockedClocks&#187;)]    private static partial int NvmlDeviceSetMemoryLockedClocks(IntPtr device, uint minMemClockMHz, uint maxMemClockMHz);    [LibraryImport(NvmlLibrary, EntryPoint = &#171;nvmlDeviceResetMemoryLockedClocks&#187;)]    private static partial int NvmlDeviceResetMemoryLockedClocks(IntPtr device);    [LibraryImport(NvmlLibrary, EntryPoint = &#171;nvmlDeviceGetGraphicsRunningProcesses_v3&#187;)]    private static partial int NvmlDeviceGetGraphicsRunningProcesses(IntPtr device, ref uint infoCount, [Out] nvmlProcessInfo_t[] infos);    [LibraryImport(NvmlLibrary, EntryPoint = &#171;nvmlDeviceGetComputeRunningProcesses_v3&#187;)]    private static partial int NvmlDeviceGetComputeRunningProcesses(IntPtr device, ref uint infoCount, [Out] nvmlProcessInfo_t[] infos);    [LibraryImport(NvmlLibrary, EntryPoint = &#171;nvmlDeviceSetFanSpeed_v2&#187;)]    private static partial int NvmlDeviceSetFanSpeed(IntPtr device, uint fan, uint speed);    [LibraryImport(NvmlLibrary, EntryPoint = &#171;nvmlDeviceSetDefaultFanSpeed_v2&#187;)]    private static partial int NvmlDeviceSetDefaultFanSpeed(IntPtr device, uint fan);    [LibraryImport(NvmlLibrary, EntryPoint = &#171;nvmlDeviceGetNumFans&#187;)]    private static partial int NvmlDeviceGetNumFans(IntPtr device, out uint numFans);    public NvidiaGpuProvider()    {        if (NvmlInit() != 0)            throw new Exception(&#171;\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c NVML \u0434\u0440\u0430\u0439\u0432\u0435\u0440.&#187;);        if (NvmlDeviceGetHandleByIndex(0, out _deviceHandle) != 0)            throw new Exception(&#171;\u0412\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430 NVIDIA \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.&#187;);    }    public GpuTelemetry GetTelemetry()    {        IntPtr namePtr = Marshal.AllocHGlobal(96);        string gpuName = &#171;Unknown GPU&#187;;        if (NvmlDeviceGetName(_deviceHandle, namePtr, 96) == 0)        {            gpuName = Marshal.PtrToStringUTF8(namePtr) ?? gpuName;        }        Marshal.FreeHGlobal(namePtr);        NvmlDeviceGetTemperature(_deviceHandle, 0, out uint temp);        NvmlDeviceGetPowerUsage(_deviceHandle, out uint powerMw);        NvmlDeviceGetUtilizationRates(_deviceHandle,&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-492348","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/492348","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=492348"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/492348\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=492348"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=492348"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=492348"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}