Перейти к публикации
Форум - ComputerCraft
  • 0
Jakowlew

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

Вопрос

Привет. Два дня назад я наткнулся на чей-то гайд по 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))

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендованные сообщения

  • 0

 

 

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

 

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

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

Но затем, в какой-то момент Сангар переработал систему лимитов по производительности, и больше это не работает.

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

(Хотя я это лично не проверял, и можно таки затестить.)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

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

 

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

 

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

 

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

Изменено пользователем AtomicScience

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

 

Также можно разделить один экран пополам и выделить каждой видеокарте свою половинку монитора - по идее сработать должно, а-ля 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))

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

 

 

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

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

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

Изменено пользователем NEO

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
Собственно отсюда мой вопрос и вытекал, вроде можно, а вроде и нет

 

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

Изменено пользователем ECS
  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

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

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

 

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Я решил провести несколько замеров, чтобы убедиться в правильности следующего утверждения товарища 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

 

....

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

Изменено пользователем NEO
  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

Ну, значит я реально сделал все не так :D

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

Поделиться сообщением


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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×