Size: a a a

Compiler Development

2020 February 24

I

Ioann_V in Compiler Development
а не кусками уже сплитнутыми? :)
источник

KR

K R in Compiler Development
Foreign Function Interface - это некоторый интерфейс вызова функций одного языка из другого. Некоторый набор соглашений и реализаций.
источник

KR

K R in Compiler Development
Vasiliy Tereshkov
То есть если программа на языке X вызывает функцию на C из Kernel32.dll - это уже FFI? Просто мне казалось, что упоминание FFI, как правило, подразумевает нечто большее.
Это использование FFI.
источник

AS

Aleksey Shipilev in Compiler Development
Ioann_V
@shipilev а в fokjoinpool, там при создании задачи, мы сначала ее сплитим, так?
Не понял, что этот вопрос делает на канале про компиляторы. Но да: сначала форкаем, чтобы у других потоков тоже появилась возможность поработать, потом делаем своё. Штатно на параллельном пути тупо всё форкнуть и тупо всё джойнуть, а там уж FJP пусть сам на одном из join'ов дойдёт до последовательного вычисления. Иначе толку от такой параллелизации нет. Или я просто не понял вопроса.
источник

I

Ioann_V in Compiler Development
Aleksey Shipilev
Не понял, что этот вопрос делает на канале про компиляторы. Но да: сначала форкаем, чтобы у других потоков тоже появилась возможность поработать, потом делаем своё. Штатно на параллельном пути тупо всё форкнуть и тупо всё джойнуть, а там уж FJP пусть сам на одном из join'ов дойдёт до последовательного вычисления. Иначе толку от такой параллелизации нет. Или я просто не понял вопроса.
то есть, смотри, я крестовик если что, вот пусть у нас есть задача посчитать сумму 80 чисел, тогда в методе экзекат у задачи мы создаем 8 подзадач размерностью по 10 чисел в каждой. И считаем сумму там, а затем дождавшись все 8 подзадач, делаем сумму их результатов. Но, вот эти 8 подзадач будут доступны на исполнение, только после того как мы сделаем полное разбитие? Или мы можем сначала получить одну подзадачу и сразу начать ее выполнять другим потоком, который ее украдет и т. д?
источник

I

Ioann_V in Compiler Development
Понимаешь о чем я :)?
источник

AS

Aleksey Shipilev in Compiler Development
Никто не будет ждать полного разбиения, да и непонятно, как его дождаться (кто пулу скажет-то "разбиение закончено, вперёд"?). Как только задача fork()-нулась, она доступна для исполнения любым потоком.
источник

I

Ioann_V in Compiler Development
Aleksey Shipilev
Никто не будет ждать полного разбиения, да и непонятно, как его дождаться (кто пулу скажет-то "разбиение закончено, вперёд"?). Как только задача fork()-нулась, она доступна для исполнения любым потоком.
но при этом каких то проблем с асинхронным ожиданием подзадач - нету? Ну в моем случае, просто скажем сначала создать в методе экзекат все подзадачи, а затем их запустить и по завершении вызвать колбек - по перфомансу выгоднее.
источник

I

Ioann_V in Compiler Development
чем связать уже k работающих подзадач этим же колбеком.
источник

I

Ioann_V in Compiler Development
ведь, в последнем случае, надо делать проверку на то, не выполнилась ли задача, до того как мы поставили колбек
источник

AS

Aleksey Shipilev in Compiler Development
Академически, из исследований поведения FJP на мелких задачах становится ясно, что частенько разбиение на подзадачи есть та самая последовательная часть, которая режет на корню параллелизм в соответствии с з-ном Амдала. Поэтому-то FJP и выигрывает у обычного пула потоков, где там один нарезатель часто тупо не успевает накормить весь пул задачами.
источник

AS

Aleksey Shipilev in Compiler Development
Поэтому "правильные товарищи" даже не режут на k подзадач на каждом уровне, а режут прямо-таки на две: чем более жирную подзадачу простаивающий поток украдёт и начнёт сам дробить, тем всем легче.
источник

I

Ioann_V in Compiler Development
Aleksey Shipilev
Поэтому "правильные товарищи" даже не режут на k подзадач на каждом уровне, а режут прямо-таки на две: чем более жирную подзадачу простаивающий поток украдёт и начнёт сам дробить, тем всем легче.
я вот про эту самую нарезку на k подзадач на каждом уровне. Она эта нарезка всегда последовательная в fjp?
источник

I

Ioann_V in Compiler Development
если бы там было k*
источник

AS

Aleksey Shipilev in Compiler Development
Ну она же написана в теле execute(), который исполняется как обычный код -- последовательно! В том-то и состоит проблема: дешевле отдать жирную половину другому потоку, и вы дальше *вдвоём* будете дробить каждый свою половину, чем ждать, пока один поток последовательно отфоркает k подзадач.
источник

I

Ioann_V in Compiler Development
но как только форкаем первую из k(остаток все еще не сплитнут) подзадач, она доступна на выполнение?
источник

AS

Aleksey Shipilev in Compiler Development
да, конечно. fork() делает задачу доступной для исполнения другим потокам
источник

I

Ioann_V in Compiler Development
тогда, все понял :) А производительность мерял, кстати? Ну там, например с tbb intel?
источник

I

Ioann_V in Compiler Development
так понимаю, в основе там лок фри дек.
источник

I

Ioann_V in Compiler Development
у вас, ну или тебя. Как угодно.
источник