LINUX.ORG.RU

Представлены ПК на базе Эльбрус-8С

 , ,


4

4

25 мая на проходящей в Иннополисе (республика Татарстан) конференции «Цифровая индустрия промышленной России-2017» (ЦИПР-2017) объединенный холдинг «Росэлектроника» представил первые образцы персональных компьютеров и серверов на базе микропроцессора Эльбрус-8С.

Арсений Брыкин, заместитель генерального директора АО «Росэлектроника»:

Это новое поколение отечественной вычислительной техники. Все этапы сборки осуществляются на наших производственных площадках и на предприятиях отечественных партнёров. Все это гарантирует высокий уровень информационной безопасности оборудования. Мы ожидаем, что первая опытная партия персональных компьютеров на основе нового процессора будет готова уже к концу 2 квартала 2017 года. Образцы нового оборудования мы представляем сегодня на конференции «ЦИПР» в Иннополисе.

Отмечается, что установочная партия 2- и 4-процессорных серверов будет готова к концу 2017 года. Работать сервера будут под управлением ОС «Эльбрус», которая построена на базе ядра Linux.

Остается неясным, будет ли использоваться модификация Эльбрус-8С2 с поддержкой ОЗУ стандарта DDR4 SDRAM и оптимизированной работой кэш-памяти, или это будет оригинальный чип Эльбрус-8С.

Кратко про Эльбрус-8С: 8 ядер (1.3 ГГц), 4МБ L2 кэш, 16МБ L3 кэш, 4 контроллера памяти (DDR3-1600), пиковая производительность 250 Gflops (одинарная точность). Отдельно стоит отметить, что Эльбрус-8С производится по техпроцессу 28 нм.

>>> Подробности

Ответ на: комментарий от no-such-file

По такому признаку половина СССР были бедными - все студенты, пенсионеры и колхозники. Да и ИТР тоже - два родителя получают по 120р. делим на троих с ребёнком и вуаля, меньше 100р. на человека.

Не надо сравнивать зарплаты в СССР и сейчас, тогда было много непрямых доходов.

anonymous ()
Ответ на: комментарий от rechnick

По вашему эти 22 млн. регулярно покупают себе колбасу?

Разумеется. По 300р за кг. И мясо по 250. А ты думаешь они на одной гречке сидят? Проблема у них купить новый телевизор, а не пожрать.

no-such-file ★★★★★ ()

25 мая на проходящей в Иннополисе (республика Татарстан) конференции «Цифровая индустрия промышленной России-2017» (ЦИПР-2017) объединенный холдинг «Росэлектроника» представил первые образцы персональных компьютеров и серверов на базе микропроцессора Эльбрус-8С.

Я постараюсь поделиться своими впечатлениями от посещения сего мероприятия. Процессоры «Эльбрус» в керамическом корпусе можно было подержать в руках всем желающим, а также запросто позапускать программы на выставленном на всеобщее обозрение компьютере с «Эльбрусом» внутри. Возле выставленного компьютера мне удалось пообщаться с разработчиками «МЦСТ» и вот что мне удалось узнать.

Цена системного блока с «Эльбрусом» внутри составляет около 200 тысяч рублей. Покупка компьютера, программное обеспечение (операционная система «Эльбрус» на основе «Дебиана») и техническая поддержка доступна только юридическим лицам. Обновления ПО поставляются на компакт-дисках всем покупателям бессрочно. В процессоре имеется встроенная видеокарта, но возможно вставить в материнскую плату и внешнюю видеокарту. Гигабитная сеть, жёсткие диски работают по шине «Сата», монитор подключается по «Ди-Ви-Айю», присутствуют несколько разъёмов «Ю-Эс-Би».

На стенде кроме персоналок были выставлены образцы вычислительных устройств для встраиваемых решений и серверы на основе «Эльбрусов». Внешне всё выглядело вполне прилично. Разработчики охотно отвечали на мои вопросы и показались мне по-настоящему увлеченными своим делом людьми. И совершенно неожиданно подарили мне книгу по «Эльбрусу».

Что бы можно было улучшить в вычислительных устройствах на «Эльбрусах»?

1. Я бы пошёл по «яблочному» пути и делал вычислительное устройство из собственных узлов, несовместимых ни с кем. Зачем вычислительным устройствам на «Эльбрусе» совместимость с персональными компьютерами других производителей? Делаем всё своё под себя и я сейчас расскажу как.

2. Вместо шин «Пи-Си-Ай-Экспресс» лучше сделать внутри процессора десяток последовательных приёмопередатчиков, скажем, по 25 Гбит/с и подключать к этим последовательным шинам отдельные платы оперативной памяти, флэш-памяти, шин «Ю-Эс-Би» и взаимодействия с сетью.

3. Сами микросхемы флэш-памяти, динамической памяти, контроллеры сети и прочих устройств распаивать на съёмных модулях, устанавливая туда же их контроллеры в виде отдельных микросхем.

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

5. Источник электропитания можно будет сделать свой, с резервированием и защитой от перенапряжений.

6. Лучше добавить спутниковый приёмник сигналов точного времени «Глонасс/Джи-Пи-Эс» на материнскую плату. Это позволит независимо для каждого вычислительного устройства знать точное время принятия решений в задачах управления напрямую со спутника.

7. Байт-код «Джавы» тем и хорош, что позволяет вычленять типовые последовательности команд микропроцессора для возможности их исполнения на аппаратном ускорителе внутри микропроцессора. Так можно превзойти микропроцессоры «Интела» по производительности исполнения байт-кода и энергопотребление будет ниже, чем на «Интеле». Для крупных потребителей вычислительных устройств этом может быть важным.

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

9. Таким вот нехитрым способом можно получить расширяемое, малоэнергопотребляющее, сравнимое по производительности с серверами на «Интеле» и устойчивое к западным торговым ограничениям вычислительное устройство.

Enthusiast ()
Ответ на: комментарий от no-such-file

Я не думаю, я знаю. Полгода сидел без работы. Выполнял мелкие заказы. И, кстати, доходы имел побольше, чем упомянутые 22 млн. Какая, нафиг, колбаса и мясо по 300? Смешно. Крупы, курица, минтай. Даже не знаю, что едят те, кто получает 10-17 шт (а таких 34% по росстату).

rechnick ()
Ответ на: комментарий от Enthusiast

скажем, по 25 Гбит/с

чо?

скажи пожалуйста, а pci-e что, не последовательная?

и как ты собрался делать 25 гбит. ну просто интересно. можешь начать с того что покажешь как ты достигнешь 5гбит. разрешаю подглядывать в то, как это сделано в GDDR5

ckotinko ★★★ ()
Ответ на: комментарий от rechnick

Даже не знаю, что едят те, кто получает 10-17 шт (а таких 34% по росстату).

Ох как трудно жить, 10 кило свинины - 2500, мешок картошки - 1000, ну хлеб там ещё, капуста... На 5000 в месяц можно каждый день пюрешку с котлетами и супец уплетать. Ойойой жертвы Бухенвальда, голодают бедные.

no-such-file ★★★★★ ()
Ответ на: комментарий от no-such-file

Это если нет никаких других трат.

«Примерно треть граждан РФ за последние 3 месяца текущего года не догрузили в свои холодильники мяса, сыра и колбасы. Об этом в понедельник, 29 мая, сообщает RNS со ссылкой на опрос «инФОМ». Исследование проведено по заказу Банка России.»

В СССР (о чём изначально шла речь) жизнь была значительно дешевле. Вот и раскупали колбасу моментально, по фиксированной цене.

rechnick ()
Ответ на: комментарий от no-such-file

Ох как трудно жить, 10 кило свинины - 2500, мешок картошки - 1000, ну хлеб там ещё, капуста... На 5000 в месяц можно каждый день пюрешку с котлетами и супец уплетать. Ойойой жертвы Бухенвальда, голодают бедные.

А ЖКХ, а проезд, вещи? Сколько тебе лет, если честно?

anonymous ()
Ответ на: комментарий от ckotinko

и как ты собрался делать 25 гбит. ну просто интересно. можешь начать с того что покажешь как ты достигнешь 5гбит. разрешаю подглядывать в то, как это сделано в GDDR5.

Точно также, как американцы уже сделали приемопередатчики по 56 Гбит/с. У них это вышло на шестнадцатинанометровом техпроцессе. Соединять процессор с модулями будем также - кабелями. Трудностей особых я тут не вижу.

Enthusiast ()
Ответ на: комментарий от anonymous

Да это даже не самый интересный вопрос. Кто комплектующие под это дело делать собирается?

Лучше бы, чтобы производством, модернизацией и ремонтом занимался сам «МЦСТ». Так можно будет управлять качеством вычислительных устройств в целом. А технически просто отсылаем файлы документации на завод, оплачиваем счёт и получаем на почте готовые изделия. Возможно, что проверочные пульты только надо будет отправить на завод. Все решаемо.

Enthusiast ()
Ответ на: комментарий от rechnick

в СССР продовольствие вывозилось из РСФСР в так называемые «союзные республики». вот ТАМ дефицита не было никогда.

чтоб победить так называемый дефицит в РСФСР надо было просто сбросить паразитов типа украин, прибалтик и прочего закавказья. которое звездело что «мы кормим москалей», а как только было сброшено тут же осталось без порток. а ну разве что прибалты паразитировали на экспорте + обнале через ихние банки. но вроде это дело им тоже придушили.

не надо рассказывать байки про волшебный СССР. за СССР мы будем когда нибудь счет за оккупацию предъявлять всем этим небратьям.

ckotinko ★★★ ()
Ответ на: комментарий от Enthusiast

всё это хорошо, что они сделали. но давайте вернемся в например реальность. я лично только за то чтоб скинуть с корабля современности за борт стандарты JEDEC с их перманентными link retrainingами, deskewingом и прочей адской лабудой. это реальное зло. к оперативке должна вести связка последовательных интерфейсов, которые не так люто требовательны к питалову и проще разводятся.

только вот у вас нет такой оперативки. вообще нет и не предвидится. потому что в JEDEC сидят гомосексуалисты в плохом смысле этого слова.

ckotinko ★★★ ()
Ответ на: комментарий от no-such-file

Это уже не СССР

Январь 1991 это и формально ещё СССР (Беловежские соглашения подписаны только в декабре 1991), и неформально ни какой инфляции ещё и в помине не было (госрегулирование цен отменили в январе 1992).

bulch ()
Ответ на: комментарий от alexanius

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

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

Есть правильная терминология?

Приведённый предполагаемый результат подразумевает применение unroll'а, но эта оптимизация имеет ряд недостатков. Она раздувает код, даёт большую нагрузку на регистры, поэтому далеко не всегда эффективна.

Это пример. Тут дело не в самом примере и не в анролле.

Смысл моего вопроса в том, что мы имеем вашу «широкую команду».

Мы имеем код вида:

uint32_t last[4] = {42, 42, 42, 42};

void gen_random(void) {
  const uint32_t IM = 139968, IA = 3877, IC = 29573;
  for(auto & x : last) x = (x * IA + IC) % IM;
}

В данном случае сложение зависит от умножение, а «остаток от деления» от сложения. Тем самым в во всю «широкую команду» мы можем засунуть только умножение.

Для решения этой проблемы вам нужен какой-то анализ для цикла сродни векторизации. И в любом случае всё это строится на базе анролла.

Таким образом взяв уже занролленый кусок, который я выкатил выше - мы можем в первую «широкую команду» записать не одно умножение, а 4.

Вот я и спрашивал - есть ли у вас такое. Умеете ли вы пускать несколько «свободных» итераций цикла в одну вашу «длинную команду»? И как вы это делаете. И насколько успешно это работает.

Как и обещал:

#include <chrono>
#include <cstdint>
#include <cstdio>
#include <vector>
#include <sys/mman.h>
#include <algorithm>
#include <utility>
#include <tuple>


template <class T> struct SimpleAllocator {
  typedef T value_type;
  T * allocate(std::size_t n) {
    return (T *)mmap(NULL, n * sizeof(T), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_POPULATE | MAP_ANONYMOUS, 0, 0);
  }
  void deallocate(T * p, std::size_t n) { munmap(p, n * sizeof(T));}
};

typedef std::vector<uint32_t, SimpleAllocator<uint32_t>> test_vec_t;

template<typename F> auto bench(const char * name, F f, test_vec_t & v, uint64_t n) {
  v.resize(n), v.reserve(n); std::fill(v.begin(), v.end(), 123321);
  auto start_time = std::chrono::system_clock::now();
  f(v);
  auto time = std::chrono::duration<double>(std::chrono::system_clock::now() - start_time).count();
  fprintf(stderr, "%s: (%.3fs)%.2lftpc\n", name, time, (4500000000ul * time) / n);
}


uint32_t gen_random(void) {
  const int IM = 139968, IA = 3877, IC = 29573;
  static int last = 42;
  last = (last * IA + IC) % IM;
  return last;
}

void diff(test_vec_t & a, test_vec_t & b) {
  uint64_t i = 0;

  do {
    if(a[i] != b[i]) {
      fprintf(stderr, "error(%lu): a(%u) -> b(%u)\n", i, a[i], b[i]);
      return;
    }
  } while(++i != a.size());
}



constexpr uint64_t mod_pow(uint64_t num, uint64_t pow, uint64_t mod) {
  uint64_t test = 0;
  uint64_t n = num;

  for(test = 1; pow; pow >>= 1) {
    if(pow & 1)
      test = ((test % mod) * (n % mod)) % mod;

    n = ((n % mod) * (n % mod)) % mod;
  }

  return test; /* note this is potentially lossy */
}

double mod_139968(double x) {
  return x - ((int64_t)(x * 0.000007144490169181527) * 139968.);  
//   return x + ((int64_t)(x * 1. / 139968) * -139968.);  
}
  
double mod_542515968(double x) {
  return x - ((int64_t)(x * 0.000000001843263717539) * 542515968.);  
//   return x + ((int64_t)(x * 1. / 542515968) * -542515968.);  
}
  


template<size_t id, size_t nstep> struct generator {
  
  constexpr generator() {    
//     fprintf(stderr, "generator<%lu, %lu>\n", id, nstep);
  }
  
  uint32_t run() {
    // seed(n) = ((a ^ n mod m ) * seed + ((a ^ n mod (m * a)) - 1) * (1 / (a - 1) * c) mod m 
    
    auto result = mod_139968(apowm0_count * 42 + ((apowm1_count - 1) * apowm1_coef + 0.5));
  
    apowm0_count = mod_139968(apowm0_count * step_multipler_apow0);    
    apowm1_count =  mod_542515968(mod_542515968(step_multiplier_apow1_hp * apowm1_count) + (step_multiplier_apow1_lp * apowm1_count));
    
    return result;
  }
  
  void run_and_store(uint32_t * buff) {
    buff[id] = run();
  }
  
protected:
  double apowm0_count = mod_pow(a * 1, id + 1, m), apowm1_count =  mod_pow(a * 1, id + 1, m * (a -  1));
  
  
protected:
  static constexpr size_t a = 3877, c = 29573, m = 139968, seed = 42;
  static constexpr size_t step_multipler_apow0 = mod_pow(a * 1, nstep, m );
  static constexpr size_t step_multipler_apow1 = mod_pow(a * 1, nstep, m * (a - 1));
  static constexpr size_t step_multiplier_apow1_lp = mod_pow(a * 1, nstep, m * (a - 1)) & ((1ul << 15) - 1) << 0;
  static constexpr size_t step_multiplier_apow1_hp = mod_pow(a * 1, nstep, m * (a - 1)) & ((1ul << 15) - 1) << 15;
  static constexpr double apowm1_coef = (1. / (a - 1)) * c;
};





namespace detail {
  template<size_t ... ids> constexpr auto make_generators_helper(std::index_sequence<ids...>) {
    return std::make_tuple(generator<ids, sizeof...(ids)>{}...);
  }
  
  
  template<size_t ... indexes, typename ... Ttuple, typename F> constexpr void tuple_for_each_helper(std::tuple<Ttuple ...> & tuple, F f, std::index_sequence<indexes...>) {
    auto res = {((f(std::get<indexes>(tuple))), 0)...};(void)res;
  }
}

template<size_t n> constexpr auto make_generators() {
  return detail::make_generators_helper(std::make_index_sequence<n>{});
}

template<typename ... Telem, typename F> constexpr void tuple_foreach(std::tuple<Telem ...> & tuple, F f) {
  detail::tuple_for_each_helper(tuple, f, std::make_index_sequence<sizeof...(Telem)>{});
}



template<size_t n> struct nway_generator {
  
  static void vec_fill(test_vec_t & vec) {
    fill(vec.data(), vec.size());
  }
  
  static void fill(uint32_t * out, size_t len) {
    uint32_t * it = out, * end = it + len;
    
    do {
      tuple_foreach(generators, [&](auto && gen) { gen.run_and_store(it);});      
      it += n;
    } while(it < end);
  }
  
  static decltype(make_generators<n>()) generators;
};

template<size_t n> decltype(make_generators<n>()) nway_generator<n>::generators = make_generators<n>();

#ifndef N
#define N 32
#endif
__attribute_noinline__ void new_generator(test_vec_t & v) {
  nway_generator<N>::vec_fill(v);
}


int main() {
  size_t n = 1024 * 1024 * 32 * 1ul;
  test_vec_t a, b;
  bench("default", [](auto & v) {
    for(auto & x : v) x = gen_random();    
  }, a, n);
  bench("new", new_generator, b, n);
  diff(a, b);
  
}

Я адаптировал код под С++14( вроде ваш компилятор в него может), а если не сможет я сделаю на то на чём он может.

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

saifuluk ()
Ответ на: комментарий от alexanius

И да, ещё - предполагаемое преобразование не эквивалентно, т.к. в оригинальном примере используется static.

А не в оригинале глобальная переменная и ничего не поменялось.

Это приводит к тому что мы не можем запускать следующую итерацию пока не посчитаем до конца предыдущую.

Не можем, но может запускать last[0]... last[n-1]. Как я уже говорил в данном случае это смысла не имеет, но принцип такой же, как в примере выше, только для каждого запуска разные константы.

saifuluk ()
Ответ на: комментарий от devl547

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

ckotinko ★★★ ()
Ответ на: комментарий от ckotinko

зачем нужно время от времени останавливать контроллер памяти и перетренировывать линк.

ЕМНИП, синхронизация между линиями адреса и данных + компенсация длины проводников.

То же самое происходит и например с PCIe. Жду, когда ты предложишь ещё и её заменить)

devl547 ★★★★★ ()
Ответ на: комментарий от Enthusiast

УчитываяБ чо всё чаще производители распаивают память и SSD прямо на плате, то поддержка честных стандартов DDRXXX и SATA действительно выглядит не слишком обязательной. С другой стороны у нас не производят ни RAM ни ROM, чтобы был смысл уходить от стандартов. Хотя, пожалуй, SSD могли бы уже в обход SATA делать. Просто как страницы постоянной памяти. Этот стандарт в микросхемы не вшит

frost_ii ★★★★ ()
Последнее исправление: frost_ii (всего исправлений: 1)
Ответ на: комментарий от devl547

а вот и не угадали. ибо не ведаете что говорите.

тренировка линка на DDR это очень злостная операция в сравнении с PCI-E, ибо её делают раз в 150 миллисекунд. точнее эта цифра вычисляется по хитрой формуле, но можно считать что в норме это около 150мс. на pci-e это делается один раз при выборе скорости и потом только при потере клока..

задумайся, почему такая разница. хотя не задумаешся, ибо для этого надо документы качать, а качать с JEDECа тот еще геморой с регистрацией.

ckotinko ★★★ ()
Ответ на: комментарий от ckotinko

Вероятно, из-за того, что это дешевле либо в производстве, либо в имплементации контроллеров памяти, потому что в противном случае делали бы по другому.

anonymous ()
Ответ на: комментарий от anonymous

никуа это не дешевле. точнее это было бы дешевле если бы занимало меньше площади, но ска. ты представь какого размера PHY для DDR. они же по стандарту 30 миллиампер жрут непрерывно а то и больше. ибо 1.8вольт/60ом. а вообще используются не только 60 омные соединения, но и 34.7 ом. и это 1666мгц против 5ггц pci-e где ножка жрет 17миллиампер. есть такая штука как насыщение транзистора, и чтоб прокачать 30ма надо существенно большую площадь чем для 17ма. а это емкость, как затворов так и самой ножки.

и вот еще: в pci-e два провода на «бит», но частота втрое выше. оттуда можно выкинуть «лишнее» - DLL, deskewing, elastic buffers и включение наживо. и вот он, профит.

на самом деле причина в том, что перед нами аналог wintelа: другие интерфейсы для ram делать никто не будет, т.к. их не поддерживают контроллеры, а контроллеры их не будут поддерживать, т.к. никто не будет делать другие интерфейсы в оперативке.

ckotinko ★★★ ()
Ответ на: комментарий от ckotinko

Так что получается, вся индустрия использует дорогой, неэффективный и сложный стандарт просто потому что кретины? А почему Самсунг не сделает для своих смартфонов офигенно экономичную память, которой не будет у Apple? HBM же разработали для видеокарт, хотя куда более нишевый рынок.

anonymous ()