Перейти к содержимому


Фотография

Работа видеокарт с монитором

OpenComputers Gpu

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 14

#1 Оффлайн   Jakowlew

Jakowlew
  • Пользователи
  • Сообщений: 23
  • Уровень сигнала: 0,04%
  • В игре: 0 час. 17 мин.

Отправлено 01 Февраль 2018 - 17:44

Привет. Два дня назад я наткнулся на чей-то гайд по OpenComputers. Я майнкрафт не очень люблю и последние лет пять в него не заходил, но я люблю программировать, а полноценные компьютеры в игре мне очень понравились :) Но перейдем к делу: как заставить две видеокарты работать с одним экраном? Я храню компоненты в массиве и это не работает:

for i = 1, #gpu do
    gpu[i].bind(screen.address)
    gpu[i].set(1, i, tostring("GPU ", i))
end

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

gpu[1].bind(screen.address)
gpu[1].set(1, 1, tostring("GPU ", 1))

-- WTF??? --
print("")

gpu[2].bind(screen.address)
gpu[2].set(1, 2, tostring("GPU ", 2))

Что за черная магия здесь происходит? И вообще, есть ли смысл привязки нескольких видеокарт к одному экрану ради обхода ограничения на отрисовку?



#2 Оффлайн   Totoro

Totoro
  • Хранители Кода
  • Сообщений: 1 734
  • Уровень сигнала: 0,3%
  • В игре: 2 час. 13 мин.

Награды

                                      

Отправлено 01 Февраль 2018 - 20:52

И вообще, есть ли смысл привязки нескольких видеокарт к одному экрану ради обхода ограничения на отрисовку?

 

Это на самом деле хороший вопрос.

В ранних версиях OpenComputers такой фокус прокатывал, и кто-то даже пилил себе этакий псевдо-SLI на парных видюхах для ускорения графики.

Но затем, в какой-то момент Сангар переработал систему лимитов по производительности, и больше это не работает.
Скорость с двух видях будет такой-же как от одной, и поэтому смысла особого так делать нет.
(Хотя я это лично не проверял, и можно таки затестить.)



#3 Оффлайн   Jakowlew

Jakowlew
  • Автор темы
  • Пользователи
  • Сообщений: 23
  • Уровень сигнала: 0,04%
  • В игре: 0 час. 17 мин.

Отправлено 01 Февраль 2018 - 21:40

Это на самом деле хороший вопрос.

В ранних версиях OpenComputers такой фокус прокатывал, и кто-то даже пилил себе этакий псевдо-SLI на парных видюхах для ускорения графики.

Но затем, в какой-то момент Сангар переработал систему лимитов по производительности, и больше это не работает.
Скорость с двух видях будет такой-же как от одной, и поэтому смысла особого так делать нет.
(Хотя я это лично не проверял, и можно таки затестить.)

На самом деле вопрос производительности вторичен. В крайнем случае можно с двух разных компьютеров рисовать в один экран. Проблема остается такая же: как несколько видеокарт / разных компьютеров подключить к одному экрану?



#4 Оффлайн   AtomicScience

AtomicScience
  • Пользователи
  • Сообщений: 16
  • Уровень сигнала: 1,3%
  • В игре: 9 час. 41 мин.

Отправлено 01 Февраль 2018 - 23:10

На самом деле вопрос производительности вторичен. В крайнем случае можно с двух разных компьютеров рисовать в один экран. Проблема остается такая же: как несколько видеокарт / разных компьютеров подключить к одному экрану?

Помню @FluttyProger хотел реализовать отрисовку то ли GIF-анимации, то ли полноценного видео, с помощью нескольких ПК, у него даже альфа-наброски были, то есть возможно на один монитор выводить изображение с разных компьютеров.

Также можно разделить один экран пополам и выделить каждой видеокарте свою половинку монитора - по идее сработать должно, а-ля VSync

А две видеокарты к одному монитору подключить НЕВОЗМОЖНО, это даже в документации написано: http://ocdoc.cil.li/component:gpu (метод bind)

По логике, если один монитор подключен к двум ПК, то при запуске системы на каждом компьютере она автоматически забиндит видеокарту на этот монитор (если он один)


Сообщение отредактировал AtomicScience: 01 Февраль 2018 - 23:12


#5 Оффлайн   Jakowlew

Jakowlew
  • Автор темы
  • Пользователи
  • Сообщений: 23
  • Уровень сигнала: 0,04%
  • В игре: 0 час. 17 мин.

Отправлено 01 Февраль 2018 - 23:48

 

Также можно разделить один экран пополам и выделить каждой видеокарте свою половинку монитора - по идее сработать должно, а-ля VSync

Примерно так я и собирался это реализовать

 

 

 

А две видеокарты к одному монитору подключить НЕВОЗМОЖНО, это даже в документации написано: http://ocdoc.cil.li/component:gpu (метод bind)

 

"A GPU can only be bound to one screen at time" - Одна гпушка может быть привязана только к одному экрану. Про привязывание нескольких гпу к тому же экрану ничего не сказано. Собственно отсюда мой вопрос и вытекал, вроде можно, а вроде и нет. А черная магия непонятно что делает

 

gpu[1].bind(screen.address)
gpu[1].set(1, 1, tostring("GPU ", 1))
 
-- WTF??? --
print("")
 
gpu[2].bind(screen.address)
gpu[2].set(1, 2, tostring("GPU ", 2))


#6 Оффлайн   NEO

NEO
  • Пользователи
  • Сообщений: 1 748
  • Уровень сигнала: 4,88%
  • В игре: 36 час. 25 мин.
  • ГородСолнце

Награды

   3                        

Отправлено 02 Февраль 2018 - 00:00

Примерно так я и собирался это реализовать

 

 

"A GPU can only be bound to one screen at time" - Одна гпушка может быть привязана только к одному экрану. Про привязывание нескольких гпу к тому же экрану ничего не сказано. Собственно отсюда мой вопрос и вытекал, вроде можно, а вроде и нет. А черная магия непонятно что делает

А проверить нельзя что-ли?  :facepalm:

Это же не БАК куда только избранные физики могут попасть и проверить теорию Бозона Хиггса, разгоняя протоны до сотен гигаэлектронвольт.


Сообщение отредактировал NEO: 02 Февраль 2018 - 00:00


#7 Оффлайн   ECS

ECS
  • Гуру
  • Сообщений: 203
  • Уровень сигнала: 0,56%
  • В игре: 4 час. 10 мин.
  • ГородСанкт-Петербург

Награды

   10                  

Отправлено 02 Февраль 2018 - 05:27

Собственно отсюда мой вопрос и вытекал, вроде можно, а вроде и нет

 

Можно, можно. Год назад писал аналогичную систему, разделяющую экран на указанное число "строк" по вертикали, при этом каждой "строке" назначался индивидуальный компьютер с видеокартой и модемом. Контроль производился с серверной стойки, хранящей в памяти пиксельное содержимое экрана и отсылающей инфу о новых графических данных по сети. Т.е. сначала пользователь осуществлял отрисовку в экранный буфер, а затем данные об изменившихся пикселях массово отсылались одним broadcast-сообщением. Самая большая задница, с которой столкнулся - это крайне невысокая скорость передачи данных по модему, теоретически решаемая поднятием внешнего сокет-сервера и использованием интернет-платы. Было бы занятно увидеть более продуктивную реализацию 


Сообщение отредактировал ECS: 02 Февраль 2018 - 05:30

  • qwertyMAN это нравится

#8 Оффлайн   Doob

Doob
  • Пользователи
  • Сообщений: 814
  • Уровень сигнала: 19,57%
  • В игре: 146 час. 10 мин.

Награды

                                   

Отправлено 02 Февраль 2018 - 13:18

Все прекрасно биндится, в порядке живой очереди.

Я тестил это дело в одиночке. Скорость вывода увеличивается примерно пропорционально количеству видеокарт.

То есть: пришло сообщение, все видеокарты одновременно биндят монитор и спокойно выводят на него инфу.

 

Здравая идея с сервером, в модемах я разочаровался еще при компутеркрафте, когда делал многопользовательские игры.

Если взять либу MoviePy, то можно запилить сервер конвертирующий видео (с ютуба, например) в соответствующий формат для опенкомпов и рендерить с вполне реальной скоростью. Я за это дело брался, но бросил т. к. не придумал, как синхронизировать звуковую дорожку.

Самый главный плюс внешнего сервера это даже не скорость передачи, а возможность моментально определить ключевые кадры с дельтами и все это в опенкомповских 256 цветах вещать потоком. Оперкомпам не приходится напрягаться ни на что, кроме вывода кадров.



#9 Оффлайн   AtomicScience

AtomicScience
  • Пользователи
  • Сообщений: 16
  • Уровень сигнала: 1,3%
  • В игре: 9 час. 41 мин.

Отправлено 02 Февраль 2018 - 16:19

Я решил провести несколько замеров, чтобы убедиться в правильности следующего утверждения товарища Totoro:

 

Скорость с двух видях будет такой-же как от одной


Итак, я набросал следующий код:

local component = require("component")

local gpus = {}

for address in component.list("gpu") do
  table.insert(gpus, component.proxy(address))
end

for i = 1, #gpus do
	gpus[i].bind(component.screen.address)
end

----------------
local op = {
	function(i) gpus[i].fill(30, 30, 1, 1, tostring(i)) end,
	function(i) gpus[i].set(30, 30, tostring(i)) end,
	function(i) gpus[i].setForeground(i * 600000) end,
	function(i) gpus[i].setBackground(i * 100000) end,
	function(i) gpus[i].copy(30, 30, 1, 1, 30, 30) end
}
local op_num = 1
local gpu_num = 1

local start_time = require("computer").uptime()

for i = 1, 10000 do
	op[op_num](gpu_num)
	op_num = op_num + 1
	gpu_num = gpu_num + 1

	if gpu_num > #gpus then
		gpu_num = 1
	end
	
	if op_num > #op then
		op_num = 1
	end
end

component.gpu.setForeground(0xFFFFFF)
component.gpu.setBackground(0) 

print("Результат для " .. #gpus .. " видеоядер : " .. (require("computer").uptime() - start_time) .. " секунд")

Он выполняет все 5 типов операций на каждой из доступных ему видеокарт, всего 10000 операций.
Запускаем несколько раз с разным количеством видеокарт, наслаждаемся несколько секунд мелькающими цифорками и получаем результат:

1 видеоядро:
3.15

2 видеоядра:
3.15

3 видеоядра:
3.14

4 видеоядра:
3.15

5 видеоядер:
3.14

 

Вывод делайте сами

Возможно, я что-то сделал не так, но все же


Сообщение отредактировал AtomicScience: 02 Февраль 2018 - 16:20


#10 Оффлайн   NEO

NEO
  • Пользователи
  • Сообщений: 1 748
  • Уровень сигнала: 4,88%
  • В игре: 36 час. 25 мин.
  • ГородСолнце

Награды

   3                        

Отправлено 02 Февраль 2018 - 16:29

Я решил провести несколько замеров, чтобы убедиться в правильности следующего утверждения товарища Totoro:

 

....

А толку от такого кода? Я не понял как оно проверяет скорости, ты просто в цикле строчки выводишь и цвета меняешь. Суть нескольких видеоядер заключается в sli, ты делишь монитор на сектора и даешь каждому ядру, тут же ты просто 10000 раз каждым ядром порисовал. А нужно разбить монитор на 4 равных сектора и рандомно закрашивать все пиксели, но задействовав ядра так что бы каждый рисовал только в своём секторе - тогда можно говорить о производительности.


Сообщение отредактировал NEO: 02 Февраль 2018 - 16:34

  • ECS это нравится

#11 Оффлайн   AtomicScience

AtomicScience
  • Пользователи
  • Сообщений: 16
  • Уровень сигнала: 1,3%
  • В игре: 9 час. 41 мин.

Отправлено 02 Февраль 2018 - 17:11

А толку от такого кода? Я не понял как оно проверяет скорости, ты просто в цикле строчки выводишь и цвета меняешь. Суть нескольких видеоядер заключается в sli, ты делишь монитор на сектора и даешь каждому ядру, тут же ты просто 10000 раз каждым ядром порисовал. А нужно разбить монитор на 4 равных сектора и рандомно закрашивать все пиксели, но задействовав ядра так что бы каждый рисовал только в своём секторе - тогда можно говорить о производительности.

Ну, значит я реально сделал все не так :D
Попозже попробую сделать нормально, а там поглядим на производительность



#12 Оффлайн   Fingercomp

Fingercomp
  • Гуру
  • Сообщений: 1 999
  • Уровень сигнала: 171,24%
  • В игре: 1278 час. 43 мин.

Награды

                                               

Отправлено 02 Февраль 2018 - 23:52

Смысл всё это иметь будет только при нескольких компах, потому что задержка уходит на процессор, а не видяху. Но нужен способ передачи данных. Модемы, например, работают с задержкой в 1 тик.

#13 Оффлайн   Doob

Doob
  • Пользователи
  • Сообщений: 814
  • Уровень сигнала: 19,57%
  • В игре: 146 час. 10 мин.

Награды

                                   

Отправлено 03 Февраль 2018 - 01:33

На максимальном разрешении (160x50) один кадр рендерится 5-8 компами как-раз за 1 тик. 20 фпс на полный кадр это хорошо.

Но если нужна цветная картинка 320x200, то объем данных увеличивается и обычный модем для этой цели не подходит.

 

Помимо ограничений скорости обработки файловой системы и интернет-сокетов, есть ограничение рендера майна - при низком тпс видны ощутимые подлагивания. Это дело надо обстоятельно затестить на нормальном железе, чтобы определить технический предел.



#14 Оффлайн   ivan52945

ivan52945
  • Пользователи
  • Сообщений: 150
  • Уровень сигнала: 62,12%
  • В игре: 463 час. 53 мин.

Награды

                       

Отправлено 03 Февраль 2018 - 08:39

можно связные карты попобовать, или там тож задержка



#15 Оффлайн   RccHD

RccHD
  • Пользователи
  • Сообщений: 169
  • Уровень сигнала: 17,37%
  • В игре: 129 час. 42 мин.

Награды

           

Отправлено 03 Февраль 2018 - 11:25

Смысл всё это иметь будет только при нескольких компах, потому что задержка уходит на процессор, а не видяху. Но нужен способ передачи данных. Модемы, например, работают с задержкой в 1 тик.



Можно сделать передачу фреймов через дискеты + enderstorage. Читерно, но это самый лучший и эффективный способ передавать картинку.

Если функционал системы не подразумевает взаимодействия с пользователем ( примером такой системы может быть стриминговый сервис ), то можно упаковать сразу несколько кадров в один файл и передать его по дискете. Да, из-за этого будет задержка, но зато полноценные 30фпс с несколькими компами подключенными к одному монитору.





Темы с аналогичным тегами OpenComputers, Gpu

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных