Pull to refresh
44
90.1
Андрей @MegaHard

программист

Send message

Моё утверждение основано на следующих предположениях.

  1. У стартапов нет лишнего миллиона долларов в кармане, тем более если бесплатный вариант не сильно хуже.

  2. Когда стартап вырастает до уровня, при котором он может позволить себе лицензию, в этом уже нет смысла из-за кодовой базы и клиентов.

  3. Акулы рынка состоят из бывших стартапов.

Конечно, может случиться что угодно, например, ARM до какого-то размера доходов сделают бесплатным, или AMD выложит свою идеальную архитектуру. Но если нет, тогда давайте не забывать, что случается с гигантами рынка: IBM-совместимые PC остались, а самих IBM PC не осталось.

Ещё добавлю. Никто к NEON не привыкал, компилятор автоматически инструкции добавляет. На фирму может найтись 1-2 человека, которые в паре мест сделают ассемблерные вставки, так что тоже негде особо привыкать. Остаётся вопрос: "А чем это хуже NEON". Если ничем, то вроде нет смысла отваливать деньги за лицензию.

Есть подозрение, что это делается на GPU. В любом случае PHP/JS/Go и т.д. разработчики не скажут спасибо за удорожание аренды. Сколько имел дела с серверным кодом, там никаких сложных вычислений не было.

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

В железе можно делать хаки, которые запрещены в плис, например, подключить несколько транзисторов по схеме с открытым коллектором. В плис для этого придётся or лепить. Поскольку входов у ячейки 4-6 штук, для проверки на ноль 32-битного регистра эти входы надо цеплять каскадом.

С серверами ситуация может быть особой (это моё имхо). Чем обычно занимается серверный код? Читает файлы, тасует строки, json распарсивает/запарсивает, посылает запросы по сети и разбирает ответ. Какой для этого нужен набор инструкций? Базовый и умножение для арифметики указателей, ещё немного атомарных и криптографии. А дальше как в Футураме: "У вас хлеб бесплатно? Тогда нам больше ничего не надо". Все эти дополнительные расширения умножают стоимость разработки и греют плату. У сервера не столько проблема во времени, потраченном на вычисления одного запроса, сколько в возможности параллельно за недорого переварить кучу запросов.

Apple, Qualcomm и Huawei об этом не в курсе, что им не выгодно.

На практике они между собой не пересекаются, а даже если бы пересеклись, это не привело бы к блокировке доступа. С текущей конфигурацией памяти без кэша даже fence.i не понадобится. Насчёт того что экономия шин на несколько ядер не даст большого эффекта, потому что шина инструкций нужна всегда - это идея, тут надо подумать.

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

Починил. Думаю над логотипом проца.

Да я под конец заметил, когда уже залил. Вот так по ночам статьи писать.

Само ядро весит примерно 700 LE, регистры ещё около 1000. Можно сделать, например, 4 копии ядра, но доступ к памяти предоставить через 2 шины, потому что всё равно сильно не нагрузят. Каким ядрам надо, те и обращаются, остальные ждут освобождения места при необходимости.

Конвейер - вставка регистров в длинные цепочки комбинаторики, чтобы не терять время на протекание заряда, и растягивание получения результата на несколько тактов. А применительно к процессору это запрос инструкции в регистр, потом на следующем такте , декодирование, вычисление результата операции, ожидание ответа памяти, и на следующем такте запись результата. Конечно, речь о простом конвейере.

Сначала в персоналках был повальный x86, и он был слабенький. Потом прошло некоторое время, и его вычислительная мощность выросла на порядки. Даже на смартфоны начали его ставить. Среди микроконтроллеров были PIC, AVR, пользователям надо было страдать и напрягаться, чтобы случайно не прожечь неправильные фьюзы. Потом году так в 2010 на рынок ворвался ARM с помощью ST Microelectronics. Они завалили прилавки дешёвыми мощными микроконтроллерами, которые можно было легко сконфигурировать программно. ARM стал модным, привычным, его начали использовать в смартфонах. Потом его мощность выросла так, что начала обгонять x86, и Apple решила не терять время, переведя свои десктопы на ARM.

"Род приходит и род проходит, и нет ничего нового под небом". ARM микроконтроллеры стали дорогими, китайцы начали заваливать рынок дешёвой альтернативой STM в виде аналогов на RISC-V ядре. Пошла разработка видеокарт с RISC-V ядрами. В это же время у Intel проблемы с новыми процессорами и соответственно, с направлением развития. Новые ядра - довольно очевидный выход.

Оно и не одобрило, поэтому пришлось добавлять конвейер. Но когда при выносе регистров в отдельный модуль неодобрение продолжилось, пришлось искать, как это исправить. Флаг AUTO_RAM_RECOGNITION в Quartus отключает автозамену регистровой памяти на встроенную.

Это надо для развития опенсорса.

Есть в следующих коммитах, в конце статьи упоминал. Эта статья называется "ч.1". Ну и поскольку я не специалист, то могу неправильно понимать значение терминов. Проблема была с тем, что регистр, который записывается на следующем этапе, может читаться следующей командой на предыдущем этапе. И ещё внезапным было то, что компилятор генерирует код, который пишет данные в стек и сразу читает с того же места.

Когда добавлял конвейер, пришлось и сигнал паузы добавить, так что не проблема прокинуть. Но пока кэша и внеочередного исполнения инструкций нет, и так сойдёт.

На микроконтроллере код килобайт 20 занимает, так что может и встроенной памятью удастся обойтись, а остальная периферия - генераторы шагов и uart. Когда первый раз пытался переводить, генераторы уже написал, так что не всё так страшно.

Ничего себе скорость добавления обвязки. О_о

//здесь читаем с заданного адреса с выравниванием
wire [31:0] old_data = rom[d_addr[31:2]];
wire [1:0] addr_tail = d_addr[1:0];

//здесь посылаем прочитанное в процессор
assign d_data_in = d_addr == 32'h40000008 ? timer :
	d_addr < `MEMORY_SIZE * 4 ? (old_data >> (addr_tail * 8)) : 0;

//здесь выравниваем
wire [31:0] aligned_out = d_data_out << addr_tail * 8;
//и обнуляем лишнее
assign byte_mask = d_width == 0 ? 4'b0001 << addr_tail :
                   d_width == 1 ? 4'b0011 << addr_tail :
                                  4'b1111;
//здесь записываем
always@(posedge clock) begin
	if (data_w) begin
		rom[d_addr[31:2]] <= {byte_mask[3] ? aligned_out[31:24] : old_data[31:24],
							byte_mask[2] ? aligned_out[23:16] : old_data[23:16],
							byte_mask[1] ? aligned_out[15:8] : old_data[15:8],
							byte_mask[0] ? aligned_out[7:0] : old_data[7:0]};
	end
end

Но это уже для следующей статьи.

Нужны подробности. Речь про моё ядро или какое-то другое?

1

Information

Rating
100-th
Location
Ростов-на-Дону, Ростовская обл., Россия
Registered
Activity