Автор Тема: Сила многоядерности  (Прочитано 6099 раз)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Сила многоядерности
« : Июнь 19, 2012, 07:28:05 pm »
На днях купил жене нетбук на проце Atom N2600.
Машинка оказалась весьма приличной по производительности, учитывая что работает она 8 часов без дозаправки :)
Порылся во всемирной мусорке и набрел на одно старое, но довольно интересное сравнение:
Может ли Atom победить Pentium 4?

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

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

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

Кто что думает по этому поводу?

Berserker

  • Sr. Member
  • ****
  • Сообщений: 254
    • Просмотр профиля
Re: Сила многоядерности
« Ответ #1 : Июнь 19, 2012, 08:55:14 pm »
А зачем Ящику большие ресурсы? Раздельная компиляция и крайне простой язык для анализа = время < секунды )

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Сила многоядерности
« Ответ #2 : Июнь 19, 2012, 08:57:16 pm »
А зачем Ящику большие ресурсы? Раздельная компиляция и крайне простой язык для анализа = время < секунды )
Речь идет не о времени компиляции чего-то на КП в ЧЯ. Время компиляции вообще мало кого волнует.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Сила многоядерности
« Ответ #3 : Июнь 19, 2012, 09:49:27 pm »
На днях купил жене нетбук на проце Atom N2600.

Поздравляю. У меня тоже Atom N280 уже 3 года как. Машинка супер. Пишу сейчас с нее ;)

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

Даже очень хорошему компилеру нет шансов самостоятельно распараллелить программу по ядрам для традиционного императивного языка (будь то оберон или C++). Так что речь может идти только о нетрадиционных языках с разной степенью подсказки со стороны программиста о том, в каком месте параллелить.

Проблема ББ в том, что он в принципе пролетает мимо ядер, потому что многопоточность там не сделать даже вручную - надо сначала рантайм допилить. Причем Илья после такой попытки сказал, что оно того не стоит ;)

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Сила многоядерности
« Ответ #4 : Июнь 19, 2012, 09:57:57 pm »
Распараллелить автомато то можно, только это тормозить будет ведь жутко :-) У ядер часто кэши свои собственные а не общие, соответстенно если часто делать "fork/join" в плане веток вычисления, то будут постоянно гоняться данные через память и постоянные промахи кэша будут.

А у ББ более прозаическая проблема на самом деле (в плане выжимания быстродействия из процессора) - он вроде как ничего не знает про процессоры и их инструкции новее 486 (или 586, не помню точно). Соответственно все эти MMX, SSE и прочее идет лесом. Также он не умеет учитывать особенности современного конвеера процессоров.

Впрочем, на тех задачах которые сейчас решают посредством ББ, это все не критично.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

alexus

  • Гость
Re: Сила многоядерности
« Ответ #5 : Июнь 20, 2012, 04:55:17 am »
Распараллелить автомато то можно, только это тормозить будет ведь жутко :-) У ядер часто кэши свои собственные а не общие, соответстенно если часто делать "fork/join" в плане веток вычисления, то будут постоянно гоняться данные через память и постоянные промахи кэша будут.
Параллелизм разный бывает. Есть SMP, а есть и MPP, например...
По-хорошему, возможный параллелизм вычислить не так уж трудно. Примем, как начальное допущение, что любые действия выполняются параллельно, если нет зависимости по данным. Пример параллельных вычислений:
A := B * C;
D := B + E;
F := (B - C) mod E;
Последовательные вычисления:
A := B * C;
D := A - E;
F := (D + A) div E;
"Умный" компилятор может без проблем вычислить зависимости и создать подсказки для процессора... Сказанное выше относится не только к арифметическим действиям, но и к условным операторам, итерациям циклов, операторам выбора и пр.
Чего не может сделать компилятор, так это вычислить "логическую" параллельность. "Логическая" параллельность отличается от параллелизма времени исполнения тем, что содержит ряд дополнительных параметров, которые меняются вовне. Простой пример. Код А и код Б выполняются параллельно, мы можем при старте программы выполнить оба кода, но результаты их работы будут востребованы значительно позже... И если бы мы выполнили эти кода тогда, когда в них возникла потребность, то результаты были бы другие, нежели при старте программы. Например, мы можем принести домой хлеб, если пойдём в магазин тогда, когда он работает, и не принести хлеба, если магазин не работает. Это простой пример с одним потоком. Если мы рассматриваем более одного потока (А и Б, как выше), то возможна ситуация, когда у этих потоков есть внешняя (по отношению к программе) взаимозависимость. Программист знает об этом, а компилятор - нет (эта зависимость существует вне программы). Соответственно, компилятор не сможет правильно задать параллельность исполнения.
А если говорить о параллелизме более предметно, то надо переходить к терминологии систем, поскольку каждый поток - это часть единого целого... Об этом я говорил на oberoncore, но...

Vartovyj

  • Full Member
  • ***
  • Сообщений: 197
    • Просмотр профиля
Re: Сила многоядерности
« Ответ #6 : Июнь 20, 2012, 10:13:54 am »
Чего не может сделать компилятор, так это вычислить "логическую" параллельность.
Вот именно для этого и нужна поддержка параллельности в яп.

alexus

  • Гость
Re: Сила многоядерности
« Ответ #7 : Июнь 20, 2012, 11:18:41 am »
Чего не может сделать компилятор, так это вычислить "логическую" параллельность.
Вот именно для этого и нужна поддержка параллельности в яп.
Примеров тому... множество, но много ли среди них удачных?

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Сила многоядерности
« Ответ #8 : Июнь 20, 2012, 01:31:07 pm »
Я так понимаю, что хороший копилер сегодня - это компилер оптимизирующий под многие ядра.
Нет. На разных ядрах выполняются разные потоки. Разбить решаемую задачу на несколько потоков и организовать их взаимодействие есть задача программиста.

Другое дело суперскалярность. Чуть усечённый пример Усова:
A := B * C;
D := B + E;
на современном процессоре скорее всего будет выполнен за один такт. Но от компилятора это тоже не зависит, это уже сам процессор делает.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Сила многоядерности
« Ответ #9 : Июнь 20, 2012, 02:08:37 pm »
Другое дело суперскалярность. Чуть усечённый пример Усова:
A := B * C;
D := B + E;
на современном процессоре скорее всего будет выполнен за один такт. Но от компилятора это тоже не зависит, это уже сам процессор делает.
На самом деле зависит. Есть более одного способа эти выражения преобразовать в машкод. И не каждый из порожденных машкодов будет хорош для того, чтобы процессор догадался как эту кашу за один такт прожевать.

Алсо см. всякие SSE, AltVec, Ion, и прочие наборы SIMD инструкций для векторных вычислений.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Сила многоядерности
« Ответ #10 : Июнь 21, 2012, 04:04:11 pm »
Цитировать
Компилятор Intel предлагает воспользоваться стандартом OpenMP (www.openmp.org) где количество ядер определяется автоматически. Стандарт очень удобен. Например, чтобы распараллелить цикл нужно написать всего лишь:
#pragma openmp parallel for
for (i=0; i<N; i++) {...}

При этом, в зависимости от количества процессоров, цикл будет разбиваться на интервалы - например 0..N/2-1 и N/2-N-1, каждый из которых будет исполняться на отдельном процессоре при условии независимости итераций друг от друга
http://forum.ixbt.com/topic.cgi?id=98:243

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Сила многоядерности
« Ответ #11 : Июнь 21, 2012, 04:08:55 pm »
Цитировать
Компилятор Intel предлагает воспользоваться стандартом OpenMP (www.openmp.org) где количество ядер определяется автоматически. Стандарт очень удобен. Например, чтобы распараллелить цикл нужно написать всего лишь:
#pragma openmp parallel for
for (i=0; i<N; i++) {...}

При этом, в зависимости от количества процессоров, цикл будет разбиваться на интервалы - например 0..N/2-1 и N/2-N-1, каждый из которых будет исполняться на отдельном процессоре при условии независимости итераций друг от друга
http://forum.ixbt.com/topic.cgi?id=98:243

Угу. Это как раз оно:
- явная подсказка со стороны программиста
- ответственность за выполнение ограничений (в данном случае: независимости итераций друг от друга) тоже на программисте

Компилятор самостоятельно ничего сделать не может. Лучше, чем ничего, конечно. И работает с тоннами существующего (непараллельного) кода. Но это все так... экстенсивный путь.
« Последнее редактирование: Июнь 21, 2012, 04:11:09 pm от vlad »