Здравствуйте, Аноним, Вы писали:
А>пример сильного распаралеливания в с++
А>матричные операции. последовательно ты оперируешь выражениями с сложением/обращением/умножением матриц. а сами операции распаралелены.
Вот скажи, зачем было этот шлак писать, да еще с таким объемом оверквотинга?
Причем тут С++? Это что DSL о которых говорит Одесски? И причем тут распараллеливание того что и так отлино распараллеливается кучей способов? Матричные вычисления — это примитивнейшая задача давно решенная (по много раз) в железе. Возьми любую библиотеку вычислений на GPU и твой С++ залюбится пыль глотать.
В общем, ответ вообще не "в кассу".
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Ziaw, Вы писали:
Z>В принципе возможно, можно параллелить списки приоритетного выбора. Нужно парсить все его варианты параллельно, отбрасывая менее приоритетные при нахождении более приоритетного выбора. Таким образом при откате правила у нас уже будет либо полностью либо частично разобранная альтернатива.
Чёйсы почти всегда обламываются на первых же символах. Синхронизация сожрет весь выигрыш.
Z>Правда сомневаюсь, что переключение контекстов не съест весь профит, в большинстве случаев откаты совсем не глубокие и не затратные.
А я не сомневаюсь. Съест с потрохами.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, z00n, Вы писали:
VD>>>> Во первых скала тупо монолитный не расширяемый язык. Z>Скала отлично расширяется через написание плагинов к компилятору, например так в нее (scala 2.8.0 ) добавляли континуации.
Принципиально очистка улицы детским совком ничем не отличается от очистки улицы бульдозером.
Z>Синтаксически (с точrи зрения DSL-ов etc.) Скала всегда было очень гибким языком.
Языком все гибко получается.
Z>Вообще, главный недостаток Scala — она не работает под .Net
Она таки работает под .Net (некоторые версии портированы), но как и любым портом сделанным для показухи пользоваться им очень не просто (если вообще возможно).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, para, Вы писали:
P>Кстати, можно попробовать сделать спекулятивный парсинг ветвей в правиле выбора
P>только не знаю, как там со Scope-ами будет...
Здравствуйте, Кодёнок, Вы писали:
KK>>Одерский объясняет, что естественным способом параллелизации различных приложений является создание предметно-ориентированных языков программирования (domain-specific language, DSL) для каждой из сфер применения
Кё>Какая вообще связь между параллелизацией и DSL?
Думаю такая. В Скале с DSL сейчас очень хреново. А поиметь их хочется (на Немерл поглядывали не раз). А тут грант дают под параллельные вычисления. Остается только притянуть за уши DSL к параллелизации и получить грант.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Кодёнок, Вы писали:
KK>>>Одерский объясняет, что естественным способом параллелизации различных приложений является создание предметно-ориентированных языков программирования (domain-specific language, DSL) для каждой из сфер применения
Кё>>Какая вообще связь между параллелизацией и DSL?
VD>Думаю такая. В Скале с DSL сейчас очень хреново. А поиметь их хочется (на Немерл поглядывали не раз). А тут грант дают под параллельные вычисления. Остается только притянуть за уши DSL к параллелизации и получить грант.
parfor дает паралеллизм порядка 70% от возможного на тех задачах что я встречался....
если конкурент превзошел тебя значит надо превзойти конкурента (пиши под 2мя бутылками водки)
как минимум надо делать распаралеливание на уровне последовательности проходов
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, z00n, Вы писали:
VD>>>>> Во первых скала тупо монолитный не расширяемый язык. Z>>Скала отлично расширяется через написание плагинов к компилятору, например так в нее (scala 2.8.0 ) добавляли континуации.
VD>Ну, ты попробуй сам что-нить прикрутить такими методами, а потом уже делай заявления в стиле "хорошо". ОК?
Я таким методом прикрутил алгебраический паттерн-матчинг (Sestoft) к луа и на всех стадиях работы был совершенно счастлив.
Я, разумеется, не использовал plugin API, а просто брал AST(lua) и паттерн-матчингом по нему ходил. Код генерировал тоже длинным образом, типа
val clauses = Clause(ConPat(CTop(n), ps), None, BlockNil, src)::Nil
Ну вот посмотрим пример с сайта скалы:
package localhost
import scala.tools.nsc
import nsc.Global
import nsc.Phase
import nsc.plugins.Plugin
import nsc.plugins.PluginComponent
class DivByZero(val global: Global) extends Plugin {
import global._
val name = "divbyzero"
val description = "checks for division by zero"
val components = List[PluginComponent](Component)
private object Component extends PluginComponent {
val global: DivByZero.this.global.type = DivByZero.this.global
val runsAfter = "refchecks"// Using the Scala Compiler 2.8.x the runsAfter should be written as below
// val runsAfter = List[String]("refchecks");
val phaseName = DivByZero.this.name
def newPhase(_prev: Phase) = new DivByZeroPhase(_prev)
class DivByZeroPhase(prev: Phase) extends StdPhase(prev) {
override def name = DivByZero.this.name
def apply(unit: CompilationUnit) {
for ( tree @ Apply(Select(rcvr, nme.DIV), List(Literal(Constant(0)))) <- unit.body;
if rcvr.tpe <:< definitions.IntClass.tpe)
{
unit.error(tree.pos, "definitely division by zero")
}
}
}
}
}
Чем это отличается от макросов? Прежде всего отсутсвием квазицитирования — поэтому нужно знать API и представлять что делаешь. Boilerplate кой-какой (на сайте скалы лежит темплейт). Так вот мое личное мнение (я его тут неоднократно озвучивал) — что человеку готовому расширять компилятор пофиг чем пользоваться, а большинству (99%+) пофиг то, что у макросов несколько ниже порог вхождения — они все равно не будут этого делать.
Z>>Принципиально это ничем не отличается от макросов, разве что макросы удобнее для мелочевки.
VD>Принципиально очистка улицы детским совком ничем не отличается от очистки улицы бульдозером.
Интересное сравнение — я то сам, например, предпочту бульдозер — т.е. залезть в компилятор и пропатчить там что надо. Плагины почти тоже самое — я прошу AST на определенной стадии и делаю с ним что хочу.
Z>>Синтаксически (с точrи зрения DSL-ов etc.) Скала всегда было очень гибким языком.
VD>Языком все гибко получается.
C-
Z>>Вообще, главный недостаток Scala — она не работает под .Net
VD>Она таки работает под .Net (некоторые версии портированы), но как и любым портом сделанным для показухи пользоваться им очень не просто (если вообще возможно).
Здравствуйте, z00n, Вы писали:
Z>Ну вот посмотрим пример с сайта скалы: Z>
Z>package localhost
Z>import scala.tools.nsc
Z>import nsc.Global
Z>import nsc.Phase
Z>import nsc.plugins.Plugin
Z>import nsc.plugins.PluginComponent
Z>class DivByZero(val global: Global) extends Plugin {
Z> import global._
Z> val name = "divbyzero"
Z> val description = "checks for division by zero"
Z> val components = List[PluginComponent](Component)
Z> private object Component extends PluginComponent {
Z> val global: DivByZero.this.global.type = DivByZero.this.global
Z> val runsAfter = "refchecks"
Z> // Using the Scala Compiler 2.8.x the runsAfter should be written as below
Z> // val runsAfter = List[String]("refchecks");
Z> val phaseName = DivByZero.this.name
Z> def newPhase(_prev: Phase) = new DivByZeroPhase(_prev)
Z> class DivByZeroPhase(prev: Phase) extends StdPhase(prev) {
Z> override def name = DivByZero.this.name
Z> def apply(unit: CompilationUnit) {
Z> for ( tree @ Apply(Select(rcvr, nme.DIV), List(Literal(Constant(0)))) <- unit.body;
Z> if rcvr.tpe <:< definitions.IntClass.tpe)
Z> {
Z> unit.error(tree.pos, "definitely division by zero")
Z> }
Z> }
Z> }
Z> }
Z>}
Z>
Z>Чем это отличается от макросов? Прежде всего отсутсвием квазицитирования — поэтому нужно знать API и представлять что делаешь.
Ага. И еще тем, что это спагети-код решает примитивную и высосанную из пальца задачу. А когда ты начнешь делать новый синтаксис, то окажется что у компилятора куча ограничений которые невозможно преодолеть.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.