LINUX.ORG.RU

ocaml и потоки


0

0

Проц - C2D. Пользую модуль Thread. При вычислиловке используется только 1 ядро. Как можно загрузить рассчетами 2 ?

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

> переписать алгоритм так

Например, как? Поясню. Есть 4 вектора (массива) A1-4 размерностью N. Нужно C=A1*A2+A3*A4. A1*A2 и A3*A4 я разнес по разным потокам, но выполняются они последовательно (на одной корке).

anonymous
()

Переписать алгоритм на erlang ;)

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

так ты так и напиши :) а то "у меня не работает" :)

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

Хм. Так может есть другой способ, может потоки из модуля Unix ? Что-то не верится, что в Ocaml'e нет механизмов для распределенных вычислений.

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

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

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

> 4.2. Нормальные там потоки, просто в библиотеке много глобальных > локов. Но вычислительная задача ведь в библиотеку не полезет...

4.2 также. С помощью потоков задействовать более одного ядра не удастся. Глобальный лок в сборщике мусора. Нужно много потоков, пишите многопроцессное приложение.

satanic-mechanic
()

ocaml не нужен? Серьезно. Мне язык показался некрасивым, а значит - не полетит.

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

>Тебе красивый язык показался некрасивым

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

Забавно, но тот же let выглядит чужеродным и слишком многословным для caml-а. Если бы авторы были последовательны, то они должны были использовать на его месте какой-либо знак или, на хухой конец, скобочку и пару точек. ;) Язык ужасен и стремится к write only.

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

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

По капче гадаем? Я на OCaml пишу ещё с тех пор, когда он был caml light, а до того много писал на SML.

> Забавно, но тот же let выглядит чужеродным и слишком многословным для caml-а.

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

> Язык ужасен и стремится к write only

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

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

> тот же let выглядит чужеродным и слишком многословным для caml-а.

Не могу согласиться, синтаксичеси let как раз хорошо отражает свою семантику. Язык ужасен и стремится к write only только в неумелых руках. Как говорил Вирт "невозможно создать язык, который не позволял бы программисту писать плохие программы". Вот так-то...

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

> там трудночитаемый код написать практически нереально.

Ну это вы сильно приувеличили. Все-таки при написании на ocaml нужна определенная дисциплина, так как синтаксис весьма богат. Впрочем, это в той или иной степени касается любого языка и разработки вообще. Без этой самой дисциплины и получается write only вне зависимости от используемых средств.

satanic-mechanic
()
Ответ на: комментарий от satanic-mechanic

> Все-таки при написании на ocaml нужна определенная дисциплина, так как синтаксис весьма богат.

Хоть и богат, но ручки выкручивает как следует. Такого, как в Си или Перле, не позволит никогда, при всём желании.

Хотя, конечно же, я могу написать код вроде вот такого:

let vec2dlen = ((B (B sqrt)) ((C (((BS B) *.) ((S +.) I))) ((S +.) I)))

Но ведь это надо специально постараться! С плохой дисциплиной такого не напишешь.

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

зы: писал не проверяя, блин, конечно же все комбинаторы (i, s, b, bs, c) - не заглавными буквами. С Caml Light попутал...

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

>Я на OCaml пишу ещё с тех пор, когда он был caml light, а до того много писал на SML.

Значит твой моск уже похаван и ты не объективен. )

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

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

>А так - язык один из самых читабельных

Ну дык, бывает и похуже, это понятно.

>Как говорил Вирт "невозможно создать язык, который не позволял бы программисту писать плохие программы".

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

Если подытожить, то можно сказать, что у меня сложилось следующее впечатление: авторы экономили печатные знаки, либо путают выразительность с "мало букв". %)

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

Ну ты загнул. Мощная, быстрая вычислиловка (GSL, BLAS...) и плюшки ФП - это зашибись.

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

> Похоже, это единственное, что авторы решили подчеркнуть.

Дурак. Ты его хотя бы видел?

match ... with, if ... then ... else, function ... -> ..., fun ... -> ..., и прочее - очень многословная и явная пунктуация, никаких нагромождений из нечитабельных символов.

> Разумнее было бы сделать читаемым весь язык.

Так и сделали. Если ты не ознакомился даже с синтаксисом языка, надеясь, что он будет похож на знакомые тебе корявые языки вроде Си или Паскаля - то это твои проблемы, к языку отношения они не имеют.

> а вот использовать побольше "букаф", т.к. именно их читают человеки, можно было бы.

Именно много букаф там и есть, во всех конструкциях.

> авторы экономили печатные знаки, либо путают выразительность с "мало букв". %)

Я так понимаю, ты не осилишь привести хотя бы один пример якобы "трудночитаемого" кода.

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

> Язык вообще не должен что-либо позволять или нет, а вот использовать побольше "букаф", т.к. именно их читают человеки, можно было бы.

> Если подытожить, то можно сказать, что у меня сложилось следующее впечатление: авторы экономили печатные знаки, либо путают выразительность с "мало букв". %)

А можно конкретные примеры про "многабукаф"? Создается впечатление, что мы писали на разных ocaml'ах.

satanic-mechanic
()
Ответ на: комментарий от satanic-mechanic

Да и действительно, создается впечатление, что анонимус привык к мейнстримовым языкам, и синтаксис ocaml ему не нравится "потому что не Java". По мне какой-нибудь Nemerle уродец еще тот...

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

Возможно, я глубоко не копал, только мельком взглянул. Хотя более близкое знакомство с ним у меня в планах (из-за более продвинутой, чем ocaml'овский camlp4, системе метапрограммирования).

satanic-mechanic
()

За примерами исходных текстов можете проследовать в гугол.

Образцом вменяемого использования знаков алфавита на данный момент для меня является пистон.

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

> За примерами исходных текстов можете проследовать в гугол.

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

Вы говорите о конкретном недостатке. Будьте добры, покажите код, и скажить, вот недостаток, он виден тут и тут.

А так слишком уныло.

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

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

> Образцом вменяемого использования знаков алфавита на данный момент для меня является пистон.

В котором, кстати, list comprehensions есть. А в OCaml их нет.

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

anonymous
()

Ой, малыши начали обзываться, как жаль. Выше я уже все сказал. Прощайте, красноглазые.

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

Ясно. Обычное толлячье говно, начисто лишенное собственных мозгов. Сдуйся отсюда, мразь.

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

camlp4 не считается, вот уж с ним точно можно сколь угодно фашистский синтаксис сделать.

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

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

satanic-mechanic
()
Ответ на: комментарий от satanic-mechanic

Ай, ну тыж видиш, что это явный троль. "Ocaml - г., но не скажу где, ибо я не осилил".

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

> 4.2 также. С помощью потоков задействовать более одного ядра не удастся. Глобальный лок в сборщике мусора. Нужно много потоков, пишите многопроцессное приложение.

Это почему же? Пока gc не работает, вполне себе потоки параллельно работают.

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

Нет, сейчас в OCaml потоки не работают параллельно никогда.

В этом году в рамках проекта OCaml Summer Project была предпринята попытка сделать в OCaml параллельный сборщик мусора, но она как-то не очень продвинулась, вроде то, что получилось, работает уж очень медленно.

satanic-mechanic
()
Ответ на: комментарий от satanic-mechanic

> В этом году в рамках проекта OCaml Summer Project была предпринята попытка сделать в OCaml параллельный сборщик мусора, но она как-то не очень продвинулась, вроде то, что получилось, работает уж очень медленно.

Погоди, если в Окамле использовать нативный код и os-level треды, то они работают параллельно, потому что уже не виртуальная машина управляет тредами, а ядро. Другое дело, что с GC в один момент времени только один поток работать может, а остальные висят на локе.

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

Да, там есть так называемые system threads. Они действительно работают поверх ОС-потоков.

Но факт, параллельно они выполняться не будут. Сейчас я не помню технических деталей, помню, что проблема в сборщике мусора. Где-то в
рассылке был пост Ксавье по этому поводу, где он обосновывал, почему сделано так. Я сегодня-завтра, если будет время, поищу, и опишу более
подробно. А пока, чтобы убедить тебя окончательно, попробуй запустить такую программу на многоядерном процессоре и посмотри, как она
загрузит ядра:

let calc x =
  while true do
    let _ = x * x in ()
  done

let _ = Thread.create calc 5
let _ = Thread.create calc 6
let _ = Thread.create calc 7
let _ = calc 8

Компиляция:
ocamlopt -thread unix.cmxa threads.cmxa test.ml -o test

т.е., как видишь, задействованы действительно system threads. Удивишься, но загружено будет лишь одно ядро.

P.S. Извини, долго не отвечал. Выходные...

satanic-mechanic
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.